plugins/factoids.lua

Thu, 09 Jul 2015 14:34:36 +0200

author
Kim Alvefur <zash@zash.se>
date
Thu, 09 Jul 2015 14:34:36 +0200
changeset 121
d68a4ae37f4a
parent 90
dd8172982299
child 137
d16c9dba9337
permissions
-rw-r--r--

plugins.factoids: Remove debug output

90
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 local storage_backends = {};
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 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
3 local factoids = {};
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 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
5 local backend;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 -- 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
8
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 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
10 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
11 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 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
14 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
15 local factoid = factoids[name];
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 if factoid then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 return factoid;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 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
19 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
20 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
21 end
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 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
24 local name = cmd.param;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 local factoid = factoids[name];
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 if factoid then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 factoids[name] = nil;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 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
29 backend.del(name);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 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
32 end
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
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 -- A simple file backend
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 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
38 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
39 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
40 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
41 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 local actions = {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 load = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 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
45 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 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
47 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
48 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
49 factoids[k] = v;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 end
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 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 end
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 save = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 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
57 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 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
59 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
60 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 end
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 add = function(k, v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 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
66 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
67 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 };
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 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
71 actions.load();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 __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
74 v = v:gsub("\n"," ");
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 rawset(t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 actions.add(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 return actions;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 -- 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
83 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
84 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
85 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
86 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
87 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 local actions = {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
89 load = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90 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
91 if chunk then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 setfenv(chunk, {_G = factoids} );
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 chunk();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 else
121
d68a4ae37f4a plugins.factoids: Remove debug output
Kim Alvefur <zash@zash.se>
parents: 90
diff changeset
95 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
96 end
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 save = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 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
100 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
101 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102 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
103 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
104 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 end
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 add = function(k,v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 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
110 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
111 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 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
113 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114 end
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 del = function(k)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 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
118 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
119 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120 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
121 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
122 end
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 }
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
125 actions.load();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
127 __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
128 rawset(t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
129 actions.add(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
130 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
131 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
132 return actions;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
133 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
134
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
135 -- 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
136 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
137 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
138 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
139 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
140 local actions = {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
141 load = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
142 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
143 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
144 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
145 setmetatable(factoids, {});
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
146 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
147 setmetatable(factoids, old_mt);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
148 df:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
149 end
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 save = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
152 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
153 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
154 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
155 fd:write(serialize(factoids));
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
156 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
157 end
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 }
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
160 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
161 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
162 actions.load();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
163 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
164 __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
165 rawset(t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
166 actions.add(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
167 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
168 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
169 return actions;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
170 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
171
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
172 -- 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
173 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
174 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
175 local factoids_node = "factoids";
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
176 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
177 local actions = {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
178 load = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
179 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
180 if storage then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
181 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
182 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
183 end
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 save = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
188 local st = verse.stanza(factoids_node, { xmlns = factoids_xmlns });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
189 for name, text in pairs(factoids) do
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
190 st:tag("factoid", { name = name }):text(text):up();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
191 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
192 bot.stream:private_set(factoids_node, factoids_xmlns, st);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
193 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
194 }
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
195 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
196 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
197 bot:hook("started", function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
198 actions.load();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
199 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
200 __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
201 rawset(t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
202 actions.add(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
203 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
204 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
205 end);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
206 return actions;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
207 end

mercurial