Mercurial > prosody-modules
comparison mod_ircd/mod_ircd.in.lua @ 503:db32236d7682
mod_ircd: some cleanup.
author | Marco Cirillo <maranda@lightwitch.org> |
---|---|
date | Sun, 11 Dec 2011 18:51:57 +0000 |
parents | 30e33292d738 |
children | de64963d8e7a |
comparison
equal
deleted
inserted
replaced
502:aad0b2df9e6b | 503:db32236d7682 |
---|---|
20 | 20 |
21 package.loaded["util.sha1"] = require "util.encodings"; | 21 package.loaded["util.sha1"] = require "util.encodings"; |
22 local verse = require "verse" | 22 local verse = require "verse" |
23 require "verse.component" | 23 require "verse.component" |
24 require "socket" | 24 require "socket" |
25 c = verse.new(); | 25 c = verse.new(); -- something interferes with prosody's console logging |
26 c:add_plugin("groupchat"); | 26 c:add_plugin("groupchat"); |
27 | 27 |
28 local function verse2prosody(e) | 28 local function verse2prosody(e) |
29 return c:event("stanza", e.stanza) or true; | 29 return c:event("stanza", e.stanza) or true; |
30 end | 30 end |
250 jids[full_jid]["nicks_changing"] = {}; | 250 jids[full_jid]["nicks_changing"] = {}; |
251 | 251 |
252 if session.nick then nicks[session.nick] = session; end | 252 if session.nick then nicks[session.nick] = session; end |
253 end | 253 end |
254 local function send_motd(session) | 254 local function send_motd(session) |
255 local nick = session.nick; | 255 local nick = session.nick; |
256 | 256 |
257 if session.username and session.nick then -- send MOTD only if username and nick are set | 257 if session.username and session.nick then -- send MOTD only if username and nick are set |
258 session.send{from = muc_server, "001", nick, "Welcome in the IRC to MUC XMPP Gateway, "..nick}; | 258 session.send{from = muc_server, "001", nick, "Welcome in the IRC to MUC XMPP Gateway, "..nick}; |
259 session.send{from = muc_server, "002", nick, "Your host is "..muc_server.." running Prosody "..prosody.version}; | 259 session.send{from = muc_server, "002", nick, "Your host is "..muc_server.." running Prosody "..prosody.version}; |
260 session.send{from = muc_server, "003", nick, "This server was created the "..os.date(nil, prosody.start_time)} | 260 session.send{from = muc_server, "003", nick, "This server was created the "..os.date(nil, prosody.start_time)} |
261 session.send{from = muc_server, "004", nick, table.concat({muc_server, "mod_ircd(alpha-0.8)", "i", "aoqv"}, " ")}; | 261 session.send{from = muc_server, "004", nick, table.concat({muc_server, "mod_ircd(alpha-0.8)", "i", "aoqv"}, " ")}; |
262 session.send((":%s %s %s %s :%s"):format(muc_server, "005", nick, "CHANTYPES=# PREFIX=(qaov)~&@+", "are supported by this server")); | 262 session.send((":%s %s %s %s :%s"):format(muc_server, "005", nick, "CHANTYPES=# PREFIX=(qaov)~&@+", "are supported by this server")); |
263 session.send((":%s %s %s %s :%s"):format(muc_server, "005", nick, "STATUSMSG=~&@+", "are supported by this server")); | 263 session.send((":%s %s %s %s :%s"):format(muc_server, "005", nick, "STATUSMSG=~&@+", "are supported by this server")); |
264 session.send{from = muc_server, "375", nick, "- "..muc_server.." Message of the day -"}; | 264 session.send{from = muc_server, "375", nick, "- "..muc_server.." Message of the day -"}; |
265 session.send{from = muc_server, "372", nick, "-"}; | 265 session.send{from = muc_server, "372", nick, "-"}; |
266 session.send{from = muc_server, "372", nick, "- Please be warned that this is only a partial irc implementation,"}; | 266 session.send{from = muc_server, "372", nick, "- Please be warned that this is only a partial irc implementation,"}; |
267 session.send{from = muc_server, "372", nick, "- it's made to facilitate users transiting away from irc to XMPP."}; | 267 session.send{from = muc_server, "372", nick, "- it's made to facilitate users transiting away from irc to XMPP."}; |
268 session.send{from = muc_server, "372", nick, "-"}; | 268 session.send{from = muc_server, "372", nick, "-"}; |
269 session.send{from = muc_server, "372", nick, "- Prosody is _NOT_ an IRC Server and it never will."}; | 269 session.send{from = muc_server, "372", nick, "- Prosody is _NOT_ an IRC Server and it never will."}; |
270 session.send{from = muc_server, "372", nick, "- We also would like to remind you that this plugin is provided as is,"}; | 270 session.send{from = muc_server, "372", nick, "- We also would like to remind you that this plugin is provided as is,"}; |
271 session.send{from = muc_server, "372", nick, "- it's still an Alpha and it's still a work in progress, use it at your sole"}; | 271 session.send{from = muc_server, "372", nick, "- it's still an Alpha and it's still a work in progress, use it at your sole"}; |
272 session.send{from = muc_server, "372", nick, "- risk as there's a not so little chance something will break."}; | 272 session.send{from = muc_server, "372", nick, "- risk as there's a not so little chance something will break."}; |
273 session.send{from = nick, "MODE", nick, "+i"}; -- why -> Invisible mode setting, | 273 session.send{from = nick, "MODE", nick, "+i"}; -- why -> Invisible mode setting, |
274 end -- enforce by default on most servers (since the source host doesn't show it's sensible to have it "set") | 274 end -- enforce by default on most servers (since the source host doesn't show it's sensible to have it "set") |
275 end | 275 end |
276 | 276 |
277 function commands.NICK(session, args) | 277 function commands.NICK(session, args) |
278 local nick = args[1]; | 278 local nick = args[1]; |
279 nick = nick:gsub("[^%w_]",""); | 279 nick = nick:gsub("[^%w_]",""); |
288 | 288 |
289 session.send{from=oldnick.."!"..nicks[nick].username, "NICK", nick}; | 289 session.send{from=oldnick.."!"..nicks[nick].username, "NICK", nick}; |
290 | 290 |
291 -- broadcast changes if required | 291 -- broadcast changes if required |
292 if session.rooms then | 292 if session.rooms then |
293 session.nicks_changing[nick] = { oldnick, session.username }; | 293 session.nicks_changing[nick] = { oldnick, session.username }; |
294 | 294 |
295 for id, room in pairs(session.rooms) do room:change_nick(nick); end | 295 for id, room in pairs(session.rooms) do room:change_nick(nick); end |
296 | 296 |
297 session.nicks_changing[nick] = nil; | 297 session.nicks_changing[nick] = nil; |
298 end | 298 end |
299 | 299 |
309 -- Some choppy clients send in NICK before USER, that needs to be handled | 309 -- Some choppy clients send in NICK before USER, that needs to be handled |
310 if session.username then | 310 if session.username then |
311 set_t_data(session, jid.join(session.username, component_jid, "ircd")); | 311 set_t_data(session, jid.join(session.username, component_jid, "ircd")); |
312 end | 312 end |
313 | 313 |
314 send_motd(session); | 314 send_motd(session); |
315 end | 315 end |
316 | 316 |
317 function commands.USER(session, params) | 317 function commands.USER(session, params) |
318 local username = params[1]; | 318 local username = params[1]; |
319 | 319 |
329 end | 329 end |
330 else | 330 else |
331 return session.send{from=muc_server, "462", "USER", "You may not re-register."} | 331 return session.send{from=muc_server, "462", "USER", "You may not re-register."} |
332 end | 332 end |
333 | 333 |
334 send_motd(session); | 334 send_motd(session); |
335 end | 335 end |
336 | 336 |
337 function commands.USERHOST(session, params) -- can show only users on the gateway. Needed for some clients to determinate self hostmask. | 337 function commands.USERHOST(session, params) -- can show only users on the gateway. Needed for some clients to determinate self hostmask. |
338 local nick = params[1]; | 338 local nick = params[1]; |
339 | 339 |
340 if not nick then session.send{from=muc_server, "461", "USERHOST", "Not enough parameters"}; return; end | 340 if not nick then session.send{from=muc_server, "461", "USERHOST", "Not enough parameters"}; return; end |
341 | 341 |
342 if nicks[nick] and nicks[nick].nick and nicks[nick].username then | 342 if nicks[nick] and nicks[nick].nick and nicks[nick].username then |
343 session.send{from=muc_server, "302", session.nick, nick.."=+"..nicks[nick].username}; return; | 343 session.send{from=muc_server, "302", session.nick, nick.."=+"..nicks[nick].username}; return; |
344 else | 344 else |
345 return; | 345 return; |
346 end | 346 end |
347 end | 347 end |
348 | 348 |
349 local function mode_map(am, rm, nicks) | 349 local function mode_map(am, rm, nicks) |
350 local rnick; | 350 local rnick; |
351 local c_modes; | 351 local c_modes; |
378 end | 378 end |
379 commands.NAMES(session, channel); | 379 commands.NAMES(session, channel); |
380 end | 380 end |
381 | 381 |
382 room:hook("subject-changed", function(changed) | 382 room:hook("subject-changed", function(changed) |
383 session.send((":%s TOPIC %s :%s"):format(changed.by.nick, channel, changed.to or "")); | 383 session.send{from=changed.by.nick, "TOPIC", channel, changed.to or ""} |
384 end); | 384 end); |
385 | 385 |
386 room:hook("message", function(event) | 386 room:hook("message", function(event) |
387 if not event.body then return end | 387 if not event.body then return end |
388 local nick, body = event.nick, event.body; | 388 local nick, body = event.nick, event.body; |
407 if xar_item.attr.affiliation and xar_item.attr.role then | 407 if xar_item.attr.affiliation and xar_item.attr.role then |
408 if not jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["affiliation"] and | 408 if not jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["affiliation"] and |
409 not jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["role"] then | 409 not jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["role"] then |
410 jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["affiliation"] = xar_item.attr.affiliation | 410 jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["affiliation"] = xar_item.attr.affiliation |
411 jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["role"] = xar_item.attr.role | 411 jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["role"] = xar_item.attr.role |
412 n_self_changing = nicks[ar.nick] and nicks[ar.nick].nicks_changing and nicks[ar.nick].nicks_changing[ar.nick] | 412 n_self_changing = nicks[ar.nick] and nicks[ar.nick].nicks_changing and nicks[ar.nick].nicks_changing[ar.nick] |
413 if n_self_changing then return; end | 413 if n_self_changing then return; end |
414 c_modes, rnick = mode_map(xar_item.attr.affiliation, xar_item.attr.role, ar.nick); | 414 c_modes, rnick = mode_map(xar_item.attr.affiliation, xar_item.attr.role, ar.nick); |
415 if c_modes and rnick then session.send((":%s MODE %s +%s"):format(muc_server, channel, c_modes.." "..rnick)); end | 415 if c_modes and rnick then session.send((":%s MODE %s +%s"):format(muc_server, channel, c_modes.." "..rnick)); end |
416 else | 416 else |
417 c_modes, rnick = mode_map(jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["affiliation"], jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["role"], ar.nick); | 417 c_modes, rnick = mode_map(jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["affiliation"], jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["role"], ar.nick); |
418 if c_modes and rnick then session.send((":%s MODE %s -%s"):format(muc_server, channel, c_modes.." "..rnick)); end | 418 if c_modes and rnick then session.send((":%s MODE %s -%s"):format(muc_server, channel, c_modes.." "..rnick)); end |
419 jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["affiliation"] = xar_item.attr.affiliation | 419 jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["affiliation"] = xar_item.attr.affiliation |
420 jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["role"] = xar_item.attr.role | 420 jids[session.full_jid].ar_last[ar.room_jid][ar.nick]["role"] = xar_item.attr.role |
421 n_self_changing = nicks[ar.nick] and nicks[ar.nick].nicks_changing and nicks[ar.nick].nicks_changing[ar.nick] | 421 n_self_changing = nicks[ar.nick] and nicks[ar.nick].nicks_changing and nicks[ar.nick].nicks_changing[ar.nick] |
422 if n_self_changing then return; end | 422 if n_self_changing then return; end |
423 c_modes, rnick = mode_map(xar_item.attr.affiliation, xar_item.attr.role, ar.nick); | 423 c_modes, rnick = mode_map(xar_item.attr.affiliation, xar_item.attr.role, ar.nick); |
424 if c_modes and rnick then session.send((":%s MODE %s +%s"):format(muc_server, channel, c_modes.." "..rnick)); end | 424 if c_modes and rnick then session.send((":%s MODE %s +%s"):format(muc_server, channel, c_modes.." "..rnick)); end |
425 end | 425 end |
426 end | 426 end |
427 end | 427 end |
505 local room = channel and nodeprep(channel:match("^#(%w+)")) or nil; | 505 local room = channel and nodeprep(channel:match("^#(%w+)")) or nil; |
506 if not room then return end | 506 if not room then return end |
507 channel = channel:match("^([%S]*)"); | 507 channel = channel:match("^([%S]*)"); |
508 session.rooms[channel]:leave(part_message); | 508 session.rooms[channel]:leave(part_message); |
509 jids[session.full_jid].ar_last[room.."@"..muc_server] = nil; | 509 jids[session.full_jid].ar_last[room.."@"..muc_server] = nil; |
510 session.send(":"..session.nick.." PART :"..channel); | 510 session.send{from=session.nick.."!"..session.username, "PART", channel}; |
511 end | 511 end |
512 | 512 |
513 function commands.PRIVMSG(session, args) | 513 function commands.PRIVMSG(session, args) |
514 local channel, message = unpack(args); | 514 local channel, message = unpack(args); |
515 if message and #message > 0 then | 515 if message and #message > 0 then |