plugins/factoids.lua

Fri, 02 Sep 2011 00:15:06 +0200

author
Kim Alvefur <zash@zash.se>
date
Fri, 02 Sep 2011 00:15:06 +0200
changeset 90
dd8172982299
child 121
d68a4ae37f4a
permissions
-rw-r--r--

plugins.factoids: Add plugin for storing text snippets, with multiple backends

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 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
93 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 __newindex = function (...) rawset(...); print(...) end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 setfenv(chunk, {_G = factoids} );
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 chunk();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 setmetatable(factoids, old_mt);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 else
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
100 print(err);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
101 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 save = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 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
105 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
106 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 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
108 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
109 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
110 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 add = function(k,v)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114 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
115 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
116 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 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
118 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
121 del = function(k)
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
122 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
123 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
124 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
125 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
126 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
127 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
128 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
129 }
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
130 actions.load();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
131 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
132 __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
133 print("__newindex", t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
134 rawset(t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
135 actions.add(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
136 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
137 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
138 return actions;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
139 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
140
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
141 -- 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
142 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
143 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
144 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
145 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
146 local actions = {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
147 load = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
148 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
149 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
150 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
151 setmetatable(factoids, {});
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
152 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
153 setmetatable(factoids, old_mt);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
154 df:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
155 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
156 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
157 save = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
158 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
159 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
160 if fd then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
161 fd:write(serialize(factoids));
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
162 fd:close();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
163 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
164 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
165 }
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
166 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
167 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
168 actions.load();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
169 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
170 __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
171 print("__newindex", t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
172 rawset(t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
173 actions.add(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
174 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
175 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
176 return actions;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
177 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
178
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
179 -- 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
180 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
181 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
182 local factoids_node = "factoids";
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
183 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
184 local actions = {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
185 load = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
186 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
187 if storage then
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
188 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
189 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
190 __newindex = function (...) rawset(...); print(...) end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
191 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
192 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
193 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
194 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
195 setmetatable(factoids, old_mt);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
196 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
197 end);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
198 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
199 save = function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
200 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
201 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
202 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
203 end
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
204 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
205 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
206 }
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
207 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
208 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
209 bot:hook("started", function()
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
210 actions.load();
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
211 setmetatable(factoids, {
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
212 __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
213 print("__newindex", t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
214 rawset(t, k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
215 actions.add(k, v);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
216 end,
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
217 });
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
218 end);
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
219 return actions;
dd8172982299 plugins.factoids: Add plugin for storing text snippets, with multiple backends
Kim Alvefur <zash@zash.se>
parents:
diff changeset
220 end

mercurial