|
1 local jid_bare = require "util.jid".bare; |
|
2 |
|
3 function riddim.plugins.opdown(bot) |
|
4 local admin = bot.config.admin; |
|
5 |
|
6 -- To allow anyone other than the admin to use a command, |
|
7 -- simply add them to the table, like |
|
8 -- opdown_map = { |
|
9 -- op = { role = "moderator", "operator@host" }, -- operator is allowed to use !op |
|
10 -- "admin@host" -- allowed to use all commands |
|
11 -- } |
|
12 -- also, bot.config.admin is allowed to do anything |
|
13 |
|
14 local command_map = bot.config.opdown_map or { |
|
15 owner = { affiliation = "owner" }; |
|
16 admin = { affiliation = "admin" }; |
|
17 op = { role = "moderator" }; |
|
18 member= { affiliation = "member" }; |
|
19 down = { role = "participant", |
|
20 affiliation = "none" }; |
|
21 --ban = { affiliation = "outcast" }; |
|
22 --kick = { role = "none" }; |
|
23 } |
|
24 |
|
25 function opdown(command) |
|
26 if not command.room then |
|
27 return "This command is only available in groupchats."; |
|
28 end |
|
29 |
|
30 local what = command_map[command.command]; |
|
31 if not what then return end |
|
32 local room = command.room; |
|
33 local who = command.param or command.sender.nick; |
|
34 local commander = command.sender; |
|
35 local actor = jid_bare(command.sender.real_jid); |
|
36 |
|
37 if not actor then |
|
38 return "I don't know who you really are?"; |
|
39 end |
|
40 |
|
41 if actor ~= admin then |
|
42 local allow = false; |
|
43 for i = 1,#what do |
|
44 if what[i] == actor then |
|
45 allow = true; |
|
46 break; |
|
47 end |
|
48 end |
|
49 if not allow then |
|
50 for i = 1,#command_map do |
|
51 if command_map[i] == actor then |
|
52 allow = true; |
|
53 break; |
|
54 end |
|
55 end |
|
56 end |
|
57 if not allow then |
|
58 return "I can't let you do that!"; |
|
59 end |
|
60 end |
|
61 |
|
62 if command.room.occupants[who] then |
|
63 if what.role then |
|
64 command.room:set_role(who, what.role, "As commanded"); |
|
65 end |
|
66 if what.affiliation then |
|
67 command.room:set_affiliation(who, what.affiliation, "As commanded"); |
|
68 end |
|
69 end |
|
70 end |
|
71 |
|
72 for k in pairs(command_map) do |
|
73 bot:hook("commands/" .. k, opdown); |
|
74 end |
|
75 end |
|
76 |