plugins/factoids.lua

Sun, 05 Dec 2021 18:35:39 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Sun, 05 Dec 2021 18:35:39 +0000
changeset 165
ec0567256b11
parent 137
d16c9dba9337
permissions
-rw-r--r--

Add rtbl_admin plugin

137
d16c9dba9337 riddim.plugins.factoids: Import and use util.stanza instead of relying on now non-existant verse global
Kim Alvefur <zash@zash.se>
parents: 121
diff changeset
1 local st = require "util.stanza";
90
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local storage_backends = {};
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 function riddim.plugins.factoids(bot)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local factoids = {};
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local conf_backend = bot.config.factoid_backend;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 local backend;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 -- if backend == nil then forget everything on restart
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 if conf_backend and storage_backends[conf_backend] then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 backend = storage_backends[conf_backend](bot, factoids);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 bot:hook("unhandled-command", function(cmd)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 local name, param = cmd.command, cmd.param;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 local factoid = factoids[name];
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 if factoid then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 return factoid;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 elseif param and #param > 4 and param:match("^is ") then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 factoids[name] = param:sub(4);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 return "I'll remember that.";
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 end);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 bot:hook("commands/forget", function(cmd)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 local name = cmd.param;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 local factoid = factoids[name];
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 if factoid then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 factoids[name] = nil;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 if backend and backend.del then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 backend.del(name);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 return ("Okay, I'll forget that %s is %s"):format(name, factoid);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 end);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 -- A simple file backend
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 function storage_backends.file(bot, factoids)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 local factoids_file = bot.config.factoids_file or "./factoids.txt";
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 local function format_line(k, v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 return ("%s=%s\n"):format(k, v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 local actions = {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 load = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 local fd = io.open(factoids_file, "r");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 for line in fd:lines() do
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 local k, v = line:match("^(.+)=(.*)$");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 if k and v then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 factoids[k] = v;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 save = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 local fd = io.open(factoids_file, "w");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 for k,v in pairs(factoids) do
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 fd:write(format_line(k, v));
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 add = function(k, v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 local fd = io.open(factoids_file, "a");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 fd:write(format_line(k, v));
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 };
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 function actions.del(...) actions.save(); end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 actions.load();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 __newindex = function(t, k, v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 v = v:gsub("\n"," ");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 rawset(t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 actions.add(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 return actions;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 -- A variant of the above except serializing lua code
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 function storage_backends.lua(bot, factoids)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85 local factoids_file = bot.config.factoids_file or "./factoids.dat";
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86 local function format_line(k, v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87 return ("_G[%q] = %q;\n"):format(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
89 local actions = {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90 load = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
91 local chunk, err = loadfile(factoids_file);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 if chunk then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 setfenv(chunk, {_G = factoids} );
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 chunk();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 else
121
d68a4ae37f4a plugins.factoids: Remove debug output
Kim Alvefur <zash@zash.se>
parents: 90
diff changeset
96 bot.stream:err(tostring(err));
90
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 save = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
100 local fd, err = io.open(factoids_file, "w");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
101 if err then print(err) end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 for k,v in pairs(factoids) do
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 fd:write(format_line(k, v));
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 add = function(k,v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
110 local fd, err = io.open(factoids_file, "a");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111 if err then print(err) end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 fd:write(format_line(k, v));
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
115 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
116 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 del = function(k)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
118 local fd, err = io.open(factoids_file, "a");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 if err then print(err) end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
121 fd:write(("_G[%q] = nil;\n"):format(k));
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
122 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
123 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
124 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
125 }
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 actions.load();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
127 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
128 __newindex = function(t, k, v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
129 rawset(t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
130 actions.add(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
131 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
132 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
133 return actions;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
134 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
135
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
136 -- Yet another variant, using util.serialization
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
137 function storage_backends.serialize(bot, factoids)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
138 local serialize = require "util.serialization".serialize;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
139 local deserialize = require "util.serialization".deserialize;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
140 local factoids_file = bot.config.factoids_file or "./factoids.dat";
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
141 local actions = {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
142 load = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
143 local fd = io.open(factoids_file, "r");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
144 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
145 local old_mt = getmetatable(factoids);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
146 setmetatable(factoids, {});
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
147 factoids = deserialize(fd:read("*a"));
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
148 setmetatable(factoids, old_mt);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
149 df:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
150 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
151 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
152 save = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
153 local fd, err = io.open(factoids_file, "w");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
154 if err then print(err) end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
155 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
156 fd:write(serialize(factoids));
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
157 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
158 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
159 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
160 }
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
161 function actions.add(...) actions.save(); end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
162 function actions.del(...) actions.save(); end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
163 actions.load();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
164 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
165 __newindex = function(t, k, v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
166 rawset(t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
167 actions.add(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
168 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
169 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
170 return actions;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
171 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
172
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
173 -- A backend using XEP 49 storage
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
174 function storage_backends.iq_private(bot, factoids)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
175 bot.stream:add_plugin("private");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
176 local factoids_node = "factoids";
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
177 local factoids_xmlns = "http://code.zash.se/riddim/plugins/factoids";
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
178 local actions = {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
179 load = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
180 bot.stream:private_get(factoids_node, factoids_xmlns, function (storage)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
181 if storage then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
182 for factoid in storage:children() do
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
183 factoids[factoid.attr.name or "something-invalid"] = factoid:get_text();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
184 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
185 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
186 end);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
187 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
188 save = function()
137
d16c9dba9337 riddim.plugins.factoids: Import and use util.stanza instead of relying on now non-existant verse global
Kim Alvefur <zash@zash.se>
parents: 121
diff changeset
189 local wrapper = st.stanza(factoids_node, { xmlns = factoids_xmlns });
90
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
190 for name, text in pairs(factoids) do
137
d16c9dba9337 riddim.plugins.factoids: Import and use util.stanza instead of relying on now non-existant verse global
Kim Alvefur <zash@zash.se>
parents: 121
diff changeset
191 wrapper:tag("factoid", { name = name }):text(text):up();
90
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
192 end
137
d16c9dba9337 riddim.plugins.factoids: Import and use util.stanza instead of relying on now non-existant verse global
Kim Alvefur <zash@zash.se>
parents: 121
diff changeset
193 bot.stream:private_set(factoids_node, factoids_xmlns, wrapper);
90
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
194 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
195 }
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
196 function actions.add(...) actions.save(); end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
197 function actions.del(...) actions.save(); end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
198 bot:hook("started", function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
199 actions.load();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
200 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
201 __newindex = function(t, k, v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
202 rawset(t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
203 actions.add(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
204 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
205 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
206 end);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
207 return actions;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
208 end

mercurial