9 #include "inline/stringops.h"
12 static int m_scene(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[]);
13 static int m_fsay(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[]);
14 static int m_faction(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[]);
15 static int m_npc(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[]);
16 static int m_npca(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[]);
17 static int m_displaymsg(struct Client
*source_p
, const char *channel
, int underline
, int action
, const char *nick
, const char *text
);
18 static int me_roleplay(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[]);
19 static unsigned int mymode
;
24 /* initalize the +x and +d cmodes */
25 mymode
= cflag_add('x', chm_simple
);
29 mymode
= cflag_add('d', chm_simple
);
39 /* orphan the +x and +d cmodes on modunload */
46 struct Message scene_msgtab
= {
47 "SCENE", 0, 0, 0, MFLG_SLOW
,
48 {mg_unreg
, {m_scene
, 3}, mg_ignore
, mg_ignore
, mg_ignore
, {m_scene
, 3}}
51 struct Message ambiance_msgtab
= {
52 "AMBIANCE", 0, 0, 0, MFLG_SLOW
,
53 {mg_unreg
, {m_scene
, 3}, mg_ignore
, mg_ignore
, mg_ignore
, {m_scene
, 3}}
56 struct Message fsay_msgtab
= {
57 "FSAY", 0, 0, 0, MFLG_SLOW
,
58 {mg_unreg
, {m_npc
, 4}, mg_ignore
, mg_ignore
, mg_ignore
, {m_fsay
, 4}}
61 struct Message faction_msgtab
= {
62 "FACTION", 0, 0, 0, MFLG_SLOW
,
63 {mg_unreg
, {m_npca
, 4}, mg_ignore
, mg_ignore
, mg_ignore
, {m_faction
, 4}}
66 struct Message npc_msgtab
= {
67 "NPC", 0, 0, 0, MFLG_SLOW
,
68 {mg_unreg
, {m_npc
, 4}, mg_ignore
, mg_ignore
, mg_ignore
, {m_npc
, 4}}
71 struct Message npca_msgtab
= {
72 "NPCA", 0, 0, 0, MFLG_SLOW
,
73 {mg_unreg
, {m_npca
, 4}, mg_ignore
, mg_ignore
, mg_ignore
, {m_npca
, 4}}
76 struct Message roleplay_msgtab
= {
77 "ROLEPLAY", 0, 0, 0, MFLG_SLOW
,
78 {mg_ignore
, mg_ignore
, mg_ignore
, mg_ignore
, {me_roleplay
, 5}, mg_ignore
}
81 mapi_clist_av1 roleplay_clist
[] = { &scene_msgtab
, &ambiance_msgtab
, &fsay_msgtab
, &faction_msgtab
, &npc_msgtab
, &npca_msgtab
, &roleplay_msgtab
, NULL
};
83 DECLARE_MODULE_AV1(roleplay
, _modinit
, _moddeinit
, roleplay_clist
, NULL
, NULL
, "$m_roleplay 1.0 - Taros $");
86 m_scene(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
88 m_displaymsg(source_p
, parv
[1], 0, 0, "=Scene=", parv
[2]);
93 m_fsay(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
95 m_displaymsg(source_p
, parv
[1], 0, 0, parv
[2], parv
[3]);
100 m_faction(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
102 m_displaymsg(source_p
, parv
[1], 0, 1, parv
[2], parv
[3]);
107 m_npc(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
109 m_displaymsg(source_p
, parv
[1], 1, 0, parv
[2], parv
[3]);
114 m_npca(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
116 m_displaymsg(source_p
, parv
[1], 1, 1, parv
[2], parv
[3]);
121 m_displaymsg(struct Client
*source_p
, const char *channel
, int underline
, int action
, const char *nick
, const char *text
)
123 struct Channel
*chptr
;
124 struct membership
*msptr
;
126 char *nick3
= rb_strdup(nick
);
129 if((chptr
= find_channel(channel
)) == NULL
)
131 sendto_one(source_p
, form_str(ERR_NOSUCHCHANNEL
), channel
);
135 if(!(msptr
= find_channel_membership(chptr
, source_p
)))
137 sendto_one_numeric(source_p
, ERR_NOTONCHANNEL
,
138 form_str(ERR_NOTONCHANNEL
), chptr
->chname
);
142 if(chptr
->mode
.mode
& chmode_flags
['d'])
144 sendto_one_numeric(source_p
, 573, "%s :Roleplay commands are disabled on this channel (+d)", chptr
->chname
);
148 if(!IsOper(source_p
) || chptr
->mode
.mode
& chmode_flags
['x'])
150 if(chptr
->mode
.mode
& chmode_flags
['x'])
152 if(!is_chanop_voiced(msptr
))
154 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.",
155 me
.name
, source_p
->name
, chptr
->chname
);
159 else if(!is_any_op(msptr
))
161 sendto_one(source_p
, ":%s 482 %s %s :You are not a channel operator, and thus cannot use roleplay commands on this channel.",
162 me
.name
, source_p
->name
, chptr
->chname
);
168 rb_snprintf(nick2
, sizeof(nick2
), "\x1F%s\x1F", strip_unprintable(nick3
));
170 rb_snprintf(nick2
, sizeof(nick2
), "%s", strip_unprintable(nick3
));
172 if(EmptyString(nick3
))
174 sendto_one_numeric(source_p
, 573, "%s :No visible non-stripped characters in nick.", chptr
->chname
);
179 rb_snprintf(text2
, sizeof(text2
), "\1ACTION %s", text
);
181 rb_snprintf(text2
, sizeof(text2
), "%s", text
);
183 sendto_channel_local(ALL_MEMBERS
, chptr
, ":%s!%s@npc.fakeuser.invalid PRIVMSG %s :%s", nick2
, source_p
->name
, channel
, text2
);
184 sendto_match_servs(&me
, "*", CAP_ENCAP
, NOCAPS
, "ENCAP * ROLEPLAY %s %s %s :%s",
185 source_p
->name
, channel
, nick2
, text2
);
190 me_roleplay(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
192 struct Channel
*chptr
;
194 /* Don't segfault if we get ENCAP * ROLEPLAY with an invalid channel.
195 * This shouldn't happen but it's best to be on the safe side. */
196 if((chptr
= find_channel(parv
[2])) == NULL
)
199 sendto_channel_local(ALL_MEMBERS
, chptr
, ":%s!%s@npc.fakeuser.invalid PRIVMSG %s :%s", parv
[3], parv
[1], parv
[2], parv
[4]);