]> jfr.im git - irc/rqf/shadowircd.git/commitdiff
Bring up updated roleplay module from charybdis.
authorB.Greenham <redacted>
Sat, 11 Dec 2010 21:28:40 +0000 (16:28 -0500)
committerB.Greenham <redacted>
Sat, 11 Dec 2010 21:28:40 +0000 (16:28 -0500)
extensions/m_roleplay.c
help/opers/roleplay
help/users/roleplay

index 1bf95bb8a5fd8def1af81998a4fdd66119da16c3..21dda930c769f6350da34f2423de1c1cc1200272 100644 (file)
@@ -1,3 +1,19 @@
+/*
+ * roleplay commands for charybdis.
+ *
+ * adds NPC, NPCA, and SCENE which allow users to send messages from 'fake'
+ * nicknames. in the case of NPC and NPCA, the nickname will be underlined
+ * to clearly show that it is fake. SCENE is a special case and not underlined.
+ * these commands only work on channels set +N
+ *
+ * also adds oper commands FSAY and FACTION, which are like NPC and NPCA 
+ * except without the underline.
+ * 
+ * all of these messages have the hostmask npc.fakeuser.invalid, and their ident
+ * is the nickname of the user running the commands.
+ */
+
+
 #include "stdinc.h"
 #include "ircd.h"
 #include "client.h"
@@ -8,6 +24,8 @@
 #include "s_serv.h"
 #include "inline/stringops.h"
 #include "chmode.h"
+#include "tgchange.h"
+#include "channel.h"
 
 static int m_scene(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
 static int m_fsay(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
@@ -21,12 +39,8 @@ static unsigned int mymode;
 static int
 _modinit(void)
 {
-       /* initalize the +x and +d cmodes */
-       mymode = cflag_add('x', chm_simple);
-       if (mymode == 0)
-               return -1;
-
-       mymode = cflag_add('d', chm_simple);
+       /* initalize the +N cmode */
+       mymode = cflag_add('N', chm_simple);
        if (mymode == 0)
                return -1;
 
@@ -36,10 +50,8 @@ _modinit(void)
 static void
 _moddeinit(void)
 {
-       /* orphan the +x and +d cmodes on modunload */
-       cflag_orphan('x');
-
-       cflag_orphan('d');
+       /* orphan the +N cmode on modunload */
+       cflag_orphan('N');
 }
 
 
@@ -48,6 +60,7 @@ struct Message scene_msgtab = {
        {mg_unreg, {m_scene, 3}, mg_ignore, mg_ignore, mg_ignore, {m_scene, 3}}
 };
 
+/* this serves as an alias for people who are used to inspircd/unreal m_roleplay */
 struct Message ambiance_msgtab = {
        "AMBIANCE", 0, 0, 0, MFLG_SLOW,
        {mg_unreg, {m_scene, 3}, mg_ignore, mg_ignore, mg_ignore, {m_scene, 3}}
@@ -75,12 +88,12 @@ struct Message npca_msgtab = {
 
 struct Message roleplay_msgtab = {
        "ROLEPLAY", 0, 0, 0, MFLG_SLOW,
-       {mg_ignore, mg_ignore, mg_ignore, mg_ignore, {me_roleplay, 5}, mg_ignore}
+       {mg_ignore, mg_ignore, mg_ignore, mg_ignore, {me_roleplay, 4}, mg_ignore}
 };  
 
 mapi_clist_av1 roleplay_clist[] = { &scene_msgtab, &ambiance_msgtab, &fsay_msgtab, &faction_msgtab, &npc_msgtab, &npca_msgtab, &roleplay_msgtab, NULL };
 
-DECLARE_MODULE_AV1(roleplay, _modinit, _moddeinit, roleplay_clist, NULL, NULL, "$m_roleplay 1.0 - Taros $");
+DECLARE_MODULE_AV1(roleplay, _modinit, _moddeinit, roleplay_clist, NULL, NULL, "$m_roleplay$");
 
 static int
 m_scene(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
@@ -122,7 +135,7 @@ m_displaymsg(struct Client *source_p, const char *channel, int underline, int ac
 {
        struct Channel *chptr;
        struct membership *msptr;
-       char nick2[109];
+       char nick2[NICKLEN+1];
        char *nick3 = rb_strdup(nick);
        char text2[BUFSIZE];
 
@@ -139,29 +152,28 @@ m_displaymsg(struct Client *source_p, const char *channel, int underline, int ac
                return 0;
        }
 
-       if(chptr->mode.mode & chmode_flags['d'])
+       if(!(chptr->mode.mode & chmode_flags['E']))
        {
-               sendto_one_numeric(source_p, 573, "%s :Roleplay commands are disabled on this channel (+d)", chptr->chname);
+               sendto_one_numeric(source_p, 573, "%s :Roleplay commands are not enabled on this channel.", chptr->chname);
                return 0;
        }
 
-       if(!IsOper(source_p) || chptr->mode.mode & chmode_flags['x'])
+       if(!can_send(chptr, source_p, msptr))
        {
-               if(chptr->mode.mode & chmode_flags['x'])
-               {
-                       if(!is_chanop_voiced(msptr))
-                       {
-                               sendto_one(source_p, ":%s 482 %s %s :You are not a channel operator or voice, and thus cannot use roleplay commands on this channel.",
-                                               me.name, source_p->name, chptr->chname);
-                               return 0;
-                       }
-               }
-               else if(!is_any_op(msptr))
-               {
-                       sendto_one(source_p, ":%s 482 %s %s :You are not a channel operator, and thus cannot use roleplay commands on this channel.",
-                                       me.name, source_p->name, chptr->chname);        
-                       return 0;
-               }
+               sendto_one_numeric(source_p, 573, "%s :Cannot send to channel.", chptr->chname);
+               return 0;
+       }
+
+       /* enforce flood stuff on roleplay commands */
+       if(flood_attack_channel(0, source_p, chptr, chptr->chname))
+               return 0;
+
+       /* enforce target change on roleplay commands */
+       if(!is_chanop_voiced(msptr) && !IsOper(source_p) && !add_channel_target(source_p, chptr))
+       {
+               sendto_one(source_p, form_str(ERR_TARGCHANGE),
+                          me.name, source_p->name, chptr->chname);
+               return 0;
        }
 
        if(underline)
@@ -169,6 +181,8 @@ m_displaymsg(struct Client *source_p, const char *channel, int underline, int ac
        else
                rb_snprintf(nick2, sizeof(nick2), "%s", strip_unprintable(nick3));
 
+       /* don't allow nicks to be empty after stripping
+        * this prevents nastiness like fake factions, etc. */
        if(EmptyString(nick3))
        {
                sendto_one_numeric(source_p, 573, "%s :No visible non-stripped characters in nick.", chptr->chname);
@@ -181,8 +195,8 @@ m_displaymsg(struct Client *source_p, const char *channel, int underline, int ac
                rb_snprintf(text2, sizeof(text2), "%s", text);
 
        sendto_channel_local(ALL_MEMBERS, chptr, ":%s!%s@npc.fakeuser.invalid PRIVMSG %s :%s", nick2, source_p->name, channel, text2); 
-       sendto_match_servs(&me, "*", CAP_ENCAP, NOCAPS, "ENCAP * ROLEPLAY %s %s %s :%s",
-                       source_p->name, channel, nick2, text2);
+       sendto_match_servs(source_p, "*", CAP_ENCAP, NOCAPS, "ENCAP * ROLEPLAY %s %s :%s",
+                       channel, nick2, text2);
        return 0;
 }
 
@@ -191,11 +205,11 @@ me_roleplay(struct Client *client_p, struct Client *source_p, int parc, const ch
 {
        struct Channel *chptr;
 
-       /* Don't segfault if we get ENCAP * ROLEPLAY with an invalid channel.
+       /* Don't segfault if we get ROLEPLAY with an invalid channel.
         * This shouldn't happen but it's best to be on the safe side. */
-       if((chptr = find_channel(parv[2])) == NULL)
+       if((chptr = find_channel(parv[1])) == NULL)
                return 0;
 
-       sendto_channel_local(ALL_MEMBERS, chptr, ":%s!%s@npc.fakeuser.invalid PRIVMSG %s :%s", parv[3], parv[1], parv[2], parv[4]); 
+       sendto_channel_local(ALL_MEMBERS, chptr, ":%s!%s@npc.fakeuser.invalid PRIVMSG %s :%s", parv[2], source_p->name, parv[1], parv[3]); 
        return 0;
 }
index 79d205818fa29a869c63ac5500fc5760b447516c..cb74385738e2af05314d4e3827f74ab9b5232753 100644 (file)
@@ -3,21 +3,15 @@ all of which send messages to channel under 'fake'
 nicknames. The user of the command can be identified
 by looking at the ident of the 'fake' user - it will
 always be the nickname of the person using the command,
-and the host will always be npc.fakeuser.invalid.
-
-These commands normally require chanops to run, unless
-cmode +x is on the channel in question, in which case
-any user that is voiced or above can run any roleplay
-command. Cmode +d will prevent any roleplay command
-being ran on the channel in question.
+and the host will always be npc.fakeuser.invalid. These
+commands require the target channel to be set +E, and
+obey the same restrictions as regular PRIVMSG.
 
 Roleplay commands from normal users have the nick 
 underlined, to clearly show that the message is a
 roleplay message rather than a normal one (with one
 exception). Network operators are not subject to this 
-restriction. Network operators can also use these 
-commands in any channel they are in, without requiring
-ops.
+restriction.
 
 NPC <nick> <channel> :message
 Sends a standard roleplay message to #channel with the 
index 8288a9b42d2750d19274f8d8cbf87cab9a7ed508..1fc813da30c17e3f5f9f895c861bca4b3e1222f2 100644 (file)
@@ -3,21 +3,15 @@ all of which send messages to channel under 'fake'
 nicknames. The user of the command can be identified
 by looking at the ident of the 'fake' user - it will
 always be the nickname of the person using the command,
-and the host will always be npc.fakeuser.invalid.
+and the host will always be npc.fakeuser.invalid. These
+commands require the target channel to be set +E, and
+obey the same restrictions as regular PRIVMSG.
 
-These commands normally require chanops to run, unless
-cmode +x is on the channel in question, in which case
-any user that is voiced or above can run any roleplay
-command. Cmode +d will prevent any roleplay command
-being ran on the channel in question.
-
-Roleplay commands from normal users have the nick
-underlined, to clearly show that the message is a 
+Roleplay commands from normal users have the nick 
+underlined, to clearly show that the message is a
 roleplay message rather than a normal one (with one
 exception). Network operators are not subject to this 
-restriction. Network operators can also use these
-commands in any channel they are in, without requiring
-ops.
+restriction.
 
 NPC <nick> <channel> :message
 Sends a standard roleplay message to #channel with the