diff options
author | Adam <Adam@anope.org> | 2013-04-14 17:39:01 -0500 |
---|---|---|
committer | Adam <Adam@anope.org> | 2013-04-14 17:39:01 -0500 |
commit | f08dbced60d59de28d13efee2e19097e0b42f4c7 (patch) | |
tree | b3aae56d92e788e7ca386258ac81ba8a259a8c48 | |
parent | baabc91ead367a9461bce20dfa1a0e6d44043358 (diff) |
Allow assigning service bots via /invite
-rw-r--r-- | include/messages.h | 7 | ||||
-rw-r--r-- | include/modules.h | 9 | ||||
-rw-r--r-- | modules/commands/bs_assign.cpp | 30 | ||||
-rw-r--r-- | modules/protocol/bahamut.cpp | 9 | ||||
-rw-r--r-- | modules/protocol/charybdis.cpp | 9 | ||||
-rw-r--r-- | modules/protocol/hybrid.cpp | 9 | ||||
-rw-r--r-- | modules/protocol/inspircd11.cpp | 8 | ||||
-rw-r--r-- | modules/protocol/inspircd12.cpp | 7 | ||||
-rw-r--r-- | modules/protocol/inspircd20.cpp | 7 | ||||
-rw-r--r-- | modules/protocol/ngircd.cpp | 5 | ||||
-rw-r--r-- | modules/protocol/plexus.cpp | 3 | ||||
-rw-r--r-- | modules/protocol/ratbox.cpp | 9 | ||||
-rw-r--r-- | modules/protocol/unreal.cpp | 7 | ||||
-rw-r--r-- | src/messages.cpp | 11 |
14 files changed, 98 insertions, 32 deletions
diff --git a/include/messages.h b/include/messages.h index e7991ebbc..d226a35b7 100644 --- a/include/messages.h +++ b/include/messages.h @@ -40,6 +40,13 @@ namespace Message void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override; }; + + struct CoreExport Invite : IRCDMessage + { + Invite(Module *creator, const Anope::string &mname = "INVITE") : IRCDMessage(creator, mname, 2) { SetFlag(IRCDMESSAGE_REQUIRE_USER); SetFlag(IRCDMESSAGE_SOFT_LIMIT); } + + void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override; + }; struct CoreExport Join : IRCDMessage { diff --git a/include/modules.h b/include/modules.h index 20d27b0ab..e9846f609 100644 --- a/include/modules.h +++ b/include/modules.h @@ -815,6 +815,13 @@ class CoreExport Module : public Extensible */ virtual void OnUserAway(User *u, const Anope::string &message) { } + /** Called when a user invites one of our users to a channel + * @param source The user doing the inviting + * @param c The channel the user is inviting to + * @param targ The user being invited + */ + virtual void OnInvite(User *source, Channel *c, User *targ) { } + /** Called when a vhost is deleted * @param na The nickalias of the vhost */ @@ -1018,7 +1025,7 @@ enum Implementation /* Users */ I_OnUserConnect, I_OnUserNickChange, I_OnUserQuit, I_OnPreUserLogoff, I_OnPostUserLogoff, I_OnPreJoinChannel, - I_OnJoinChannel, I_OnPrePartChannel, I_OnPartChannel, I_OnLeaveChannel, I_OnFingerprint, I_OnUserAway, + I_OnJoinChannel, I_OnPrePartChannel, I_OnPartChannel, I_OnLeaveChannel, I_OnFingerprint, I_OnUserAway, I_OnInvite, /* OperServ */ I_OnDefconLevel, I_OnAddAkill, I_OnDelAkill, I_OnExceptionAdd, I_OnExceptionDel, diff --git a/modules/commands/bs_assign.cpp b/modules/commands/bs_assign.cpp index 027193f62..bbac6e689 100644 --- a/modules/commands/bs_assign.cpp +++ b/modules/commands/bs_assign.cpp @@ -156,7 +156,37 @@ class BSAssign : public Module BSAssign(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR), commandbsassign(this), commandbsunassign(this) { + Implementation i[] = { I_OnInvite }; + ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); + } + + void OnInvite(User *source, Channel *c, User *targ) anope_override + { + BotInfo *bi; + if (Anope::ReadOnly || !c->ci || targ->server != Me || !(bi = dynamic_cast<BotInfo *>(targ))) + return; + + AccessGroup access = c->ci->AccessFor(source); + if (c->ci->HasExt("BS_NOBOT") || (!access.HasPriv("ASSIGN") && !source->HasPriv("botserv/administration"))) + { + targ->SendMessage(bi, ACCESS_DENIED); + return; + } + + if (bi->oper_only && !source->HasPriv("botserv/administration")) + { + targ->SendMessage(bi, ACCESS_DENIED); + return; + } + + if (c->ci->bi == bi) + { + targ->SendMessage(bi, _("Bot \002%s\002 is already assigned to channel \002%s\002."), c->ci->bi->nick.c_str(), c->name.c_str()); + return; + } + bi->Assign(source, c->ci); + targ->SendMessage(bi, _("Bot \002%s\002 has been assigned to %s."), bi->nick.c_str(), c->name.c_str()); } }; diff --git a/modules/protocol/bahamut.cpp b/modules/protocol/bahamut.cpp index bebca302b..458602d3b 100644 --- a/modules/protocol/bahamut.cpp +++ b/modules/protocol/bahamut.cpp @@ -482,6 +482,7 @@ class ProtoBahamut : public Module Message::Away message_away; Message::Capab message_capab; Message::Error message_error; + Message::Invite message_invite; Message::Join message_join; Message::Kick message_kick; Message::Kill message_kill; @@ -544,10 +545,10 @@ class ProtoBahamut : public Module public: ProtoBahamut(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR), ircd_proto(this), - message_away(this), message_capab(this), message_error(this), message_join(this), - message_kick(this), message_kill(this), message_motd(this), message_part(this), - message_ping(this), message_privmsg(this), message_quit(this), message_squit(this), - message_stats(this), message_time(this), message_version(this), message_whois(this), + message_away(this), message_capab(this), message_error(this), message_invite(this), + message_join(this), message_kick(this), message_kill(this), message_motd(this), + message_part(this), message_ping(this), message_privmsg(this), message_quit(this), + message_squit(this), message_stats(this), message_time(this), message_version(this), message_whois(this), message_burst(this), message_mode(this, "MODE"), message_svsmode(this, "SVSMODE"), message_nick(this), message_server(this), message_sjoin(this), message_topic(this) diff --git a/modules/protocol/charybdis.cpp b/modules/protocol/charybdis.cpp index f4efbea50..374111f44 100644 --- a/modules/protocol/charybdis.cpp +++ b/modules/protocol/charybdis.cpp @@ -324,6 +324,7 @@ class ProtoCharybdis : public Module Message::Away message_away; Message::Capab message_capab; Message::Error message_error; + Message::Invite message_invite; Message::Kick message_kick; Message::Kill message_kill; Message::Mode message_mode; @@ -384,10 +385,10 @@ class ProtoCharybdis : public Module public: ProtoCharybdis(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR), ircd_proto(this), - message_away(this), message_capab(this), message_error(this), message_kick(this), message_kill(this), - message_mode(this), message_motd(this), message_part(this), message_ping(this), message_privmsg(this), - message_quit(this), message_squit(this), message_stats(this), message_time(this), message_topic(this), - message_version(this), message_whois(this), + message_away(this), message_capab(this), message_error(this), message_invite(this), message_kick(this), + message_kill(this), message_mode(this), message_motd(this), message_part(this), message_ping(this), + message_privmsg(this), message_quit(this), message_squit(this), message_stats(this), message_time(this), + message_topic(this), message_version(this), message_whois(this), message_bmask("IRCDMessage", "charybdis/bmask", "ratbox/bmask"), message_join("IRCDMessage", "charybdis/join", "ratbox/join"), diff --git a/modules/protocol/hybrid.cpp b/modules/protocol/hybrid.cpp index 4953a37cd..a00158bf8 100644 --- a/modules/protocol/hybrid.cpp +++ b/modules/protocol/hybrid.cpp @@ -522,6 +522,7 @@ class ProtoHybrid : public Module Message::Away message_away; Message::Capab message_capab; Message::Error message_error; + Message::Invite message_invite; Message::Kick message_kick; Message::Kill message_kill; Message::Mode message_mode; @@ -594,10 +595,10 @@ class ProtoHybrid : public Module public: ProtoHybrid(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR), ircd_proto(this), - message_away(this), message_capab(this), message_error(this), message_kick(this), message_kill(this), - message_mode(this), message_motd(this), message_part(this), message_ping(this), message_privmsg(this), - message_quit(this), message_squit(this), message_stats(this), message_time(this), message_topic(this), - message_version(this), message_whois(this), + message_away(this), message_capab(this), message_error(this), message_invite(this), message_kick(this), + message_kill(this), message_mode(this), message_motd(this), message_part(this), message_ping(this), + message_privmsg(this), message_quit(this), message_squit(this), message_stats(this), message_time(this), + message_topic(this), message_version(this), message_whois(this), message_bmask(this), message_eob(this), message_join(this), message_nick(this), message_pass(this), message_pong(this), message_server(this), message_sid(this), diff --git a/modules/protocol/inspircd11.cpp b/modules/protocol/inspircd11.cpp index 82eb8e31c..eeb1e17e1 100644 --- a/modules/protocol/inspircd11.cpp +++ b/modules/protocol/inspircd11.cpp @@ -817,6 +817,7 @@ class ProtoInspIRCd : public Module /* Core message handlers */ Message::Away message_away; Message::Error message_error; + Message::Invite message_invite; Message::Join message_join; Message::Kick message_kick; Message::Kill message_kill; @@ -861,9 +862,10 @@ class ProtoInspIRCd : public Module public: ProtoInspIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR), ircd_proto(this), - message_away(this), message_error(this), message_join(this), message_kick(this), message_kill(this), - message_motd(this), message_part(this), message_ping(this), message_privmsg(this), message_quit(this), - message_squit(this), message_stats(this), message_time(this), message_topic(this), message_version(this), + message_away(this), message_error(this), message_invite(this), message_join(this), message_kick(this), + message_kill(this), message_motd(this), message_part(this), message_ping(this), message_privmsg(this), + message_quit(this), message_squit(this), message_stats(this), message_time(this), message_topic(this), + message_version(this), message_capab(this), message_chgident(this, "CHGIDENT"), message_setident(this, "SETIDENT"), message_chgname(this, "CHGNAME"), message_setname(this, "SETNAME"), message_endburst(this), diff --git a/modules/protocol/inspircd12.cpp b/modules/protocol/inspircd12.cpp index 094f514cc..80f21c3da 100644 --- a/modules/protocol/inspircd12.cpp +++ b/modules/protocol/inspircd12.cpp @@ -1170,6 +1170,7 @@ class ProtoInspIRCd : public Module /* Core message handlers */ Message::Away message_away; Message::Error message_error; + Message::Invite message_invite; Message::Join message_join; Message::Kick message_kick; Message::Kill message_kill; @@ -1205,9 +1206,9 @@ class ProtoInspIRCd : public Module public: ProtoInspIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR), ircd_proto(this), - message_away(this), message_error(this), message_join(this), message_kick(this), message_kill(this), - message_motd(this), message_part(this), message_ping(this), message_privmsg(this), message_quit(this), - message_squit(this), message_stats(this), message_topic(this), + message_away(this), message_error(this), message_invite(this), message_join(this), message_kick(this), message_kill(this), + message_motd(this), message_part(this), message_ping(this), message_privmsg(this), message_quit(this), message_squit(this), + message_stats(this), message_topic(this), message_chgident(this), message_setname(this, "SETNAME"), message_chgname(this, "FNAME"), message_capab(this), message_endburst(this), message_fhost(this, "FHOST"), message_sethost(this, "SETHOST"), message_fjoin(this), message_fmode(this), message_ftopic(this), diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp index 6d51c7932..7b21c2b08 100644 --- a/modules/protocol/inspircd20.cpp +++ b/modules/protocol/inspircd20.cpp @@ -632,6 +632,7 @@ class ProtoInspIRCd : public Module /* Core message handlers */ Message::Away message_away; Message::Error message_error; + Message::Invite message_invite; Message::Join message_join; Message::Kick message_kick; Message::Kill message_kill; @@ -663,9 +664,9 @@ class ProtoInspIRCd : public Module public: ProtoInspIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR), ircd_proto(this), - message_away(this), message_error(this), message_join(this), message_kick(this), message_kill(this), - message_motd(this), message_part(this), message_ping(this), message_privmsg(this), message_quit(this), - message_squit(this), message_stats(this), message_topic(this), + message_away(this), message_error(this), message_invite(this), message_join(this), message_kick(this), + message_kill(this), message_motd(this), message_part(this), message_ping(this), message_privmsg(this), + message_quit(this), message_squit(this), message_stats(this), message_topic(this), message_endburst("IRCDMessage", "inspircd20/endburst", "inspircd12/endburst"), message_fhost("IRCDMessage", "inspircd20/fhost", "inspircd12/fhost"), diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp index 4f6d75642..c749a2d7d 100644 --- a/modules/protocol/ngircd.cpp +++ b/modules/protocol/ngircd.cpp @@ -570,6 +570,7 @@ class ProtongIRCd : public Module /* Core message handlers */ Message::Capab message_capab; Message::Error message_error; + Message::Invite message_invite; Message::Kick message_kick; Message::Kill message_kill; Message::MOTD message_motd; @@ -643,8 +644,8 @@ class ProtongIRCd : public Module public: ProtongIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR), ircd_proto(this), - message_capab(this), message_error(this), message_kick(this), message_kill(this), message_motd(this), - message_part(this), message_ping(this), message_privmsg(this), message_squery(this, "SQUERY"), + message_capab(this), message_error(this), message_invite(this), message_kick(this), message_kill(this), + message_motd(this), message_part(this), message_ping(this), message_privmsg(this), message_squery(this, "SQUERY"), message_quit(this), message_squit(this), message_stats(this), message_time(this), message_version(this), message_005(this), message_376(this), message_chaninfo(this), message_join(this), message_metadata(this), diff --git a/modules/protocol/plexus.cpp b/modules/protocol/plexus.cpp index 9af7351ff..b256afc36 100644 --- a/modules/protocol/plexus.cpp +++ b/modules/protocol/plexus.cpp @@ -298,6 +298,7 @@ class ProtoPlexus : public Module Message::Away message_away; Message::Capab message_capab; Message::Error message_error; + Message::Invite message_invite; Message::Kick message_kick; Message::Kill message_kill; Message::Mode message_mode; @@ -355,7 +356,7 @@ class ProtoPlexus : public Module public: ProtoPlexus(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR), ircd_proto(this), - message_away(this), message_capab(this), message_error(this), message_kick(this), message_kill(this), + message_away(this), message_capab(this), message_error(this), message_invite(this), message_kick(this), message_kill(this), message_mode(this), message_motd(this), message_part(this), message_ping(this), message_privmsg(this), message_quit(this), message_squit(this), message_stats(this), message_time(this), message_topic(this), message_version(this), message_whois(this), diff --git a/modules/protocol/ratbox.cpp b/modules/protocol/ratbox.cpp index 1ac129065..2d01605bb 100644 --- a/modules/protocol/ratbox.cpp +++ b/modules/protocol/ratbox.cpp @@ -185,6 +185,7 @@ class ProtoRatbox : public Module Message::Away message_away; Message::Capab message_capab; Message::Error message_error; + Message::Invite message_invite; Message::Kick message_kick; Message::Kill message_kill; Message::Mode message_mode; @@ -230,10 +231,10 @@ class ProtoRatbox : public Module public: ProtoRatbox(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR), ircd_proto(this), - message_away(this), message_capab(this), message_error(this), message_kick(this), message_kill(this), - message_mode(this), message_motd(this), message_part(this), message_ping(this), message_privmsg(this), - message_quit(this), message_squit(this), message_stats(this), message_time(this), message_topic(this), - message_version(this), message_whois(this), + message_away(this), message_capab(this), message_error(this), message_invite(this), message_kick(this), + message_kill(this), message_mode(this), message_motd(this), message_part(this), message_ping(this), + message_privmsg(this), message_quit(this), message_squit(this), message_stats(this), message_time(this), + message_topic(this), message_version(this), message_whois(this), message_bmask("IRCDMessage", "ratbox/bmask", "hybrid/bmask"), message_join("IRCDMessage", "ratbox/join", "hybrid/join"), message_nick("IRCDMessage", "ratbox/nick", "hybrid/nick"), message_pong("IRCDMessage", "ratbox/pong", "hybrid/pong"), diff --git a/modules/protocol/unreal.cpp b/modules/protocol/unreal.cpp index d14927ee1..7a7847972 100644 --- a/modules/protocol/unreal.cpp +++ b/modules/protocol/unreal.cpp @@ -1124,6 +1124,7 @@ class ProtoUnreal : public Module /* Core message handlers */ Message::Away message_away; Message::Error message_error; + Message::Invite message_invite; Message::Join message_join; Message::Kick message_kick; Message::Kill message_kill; @@ -1198,9 +1199,9 @@ class ProtoUnreal : public Module public: ProtoUnreal(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR), ircd_proto(this), - message_away(this), message_error(this), message_join(this), message_kick(this), message_kill(this), - message_motd(this), message_part(this), message_ping(this), message_privmsg(this), message_quit(this), - message_squit(this), message_stats(this), message_time(this), message_version(this), + message_away(this), message_error(this), message_invite(this), message_join(this), message_kick(this), + message_kill(this), message_motd(this), message_part(this), message_ping(this), message_privmsg(this), + message_quit(this), message_squit(this), message_stats(this), message_time(this), message_version(this), message_whois(this), message_capab(this), message_chghost(this), message_chgident(this), message_chgname(this), message_mode(this, "MODE"), diff --git a/src/messages.cpp b/src/messages.cpp index 178d376c3..c9ffd3c59 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -49,6 +49,17 @@ void Error::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) Anope::Quitting = true; } +void Invite::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override +{ + User *targ = User::Find(params[0]); + Channel *c = Channel::Find(params[1]); + + if (!targ || targ->server != Me || !c || c->FindUser(targ)) + return; + + FOREACH_MOD(I_OnInvite, OnInvite(source.GetUser(), c, targ)); +} + void Join::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) { User *user = source.GetUser(); |