]> jfr.im git - irc/rqf/shadowircd.git/commitdiff
Add operspy /topic.
authorJilles Tjoelker <redacted>
Tue, 2 Dec 2008 23:16:05 +0000 (00:16 +0100)
committerJilles Tjoelker <redacted>
Tue, 2 Dec 2008 23:16:05 +0000 (00:16 +0100)
This allows querying any channel's topic under the
operspy rules, but not changing it.

help/opers/operspy
modules/m_topic.c

index 0f02c2b03d5abbb81d2dad86b7e37460560c4f41..2b60cc0da3bd403d42a24b04f09d1d8186c3de5a 100644 (file)
@@ -11,3 +11,4 @@ who !#channel   - Gives a full output of users on the channel.
 mode !#channel  - Gives the full modes of a channel including any keys.
 chantrace !#channel - Gives full output despite not being on channel.
 masktrace !nick!user@host :gecos - Lists matching users on all servers.
+topic !#channel - Gives full output despite not being on channel.
index da5a8c2cee78ec39035aa6d5420019f1d0435006..a69a99e29d5b47271a1b7e5650cf24600ee94b99 100644 (file)
@@ -32,6 +32,7 @@
 #include "ircd.h"
 #include "numeric.h"
 #include "send.h"
+#include "s_newconf.h"
 #include "s_conf.h"
 #include "s_serv.h"
 #include "msg.h"
@@ -62,26 +63,43 @@ m_topic(struct Client *client_p, struct Client *source_p, int parc, const char *
        struct Channel *chptr = NULL;
        struct membership *msptr;
        char *p = NULL;
+       const char *name;
+       int operspy = 0;
 
        if((p = strchr(parv[1], ',')))
                *p = '\0';
 
+       name = parv[1];
+
+       if(IsOperSpy(source_p) && parv[1][0] == '!')
+       {
+               name++;
+               operspy = 1;
+
+               if(EmptyString(name))
+               {
+                       sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS),
+                                       me.name, source_p->name, "TOPIC");
+                       return 0;
+               }
+       }
+
        if(MyClient(source_p) && !IsFloodDone(source_p))
                flood_endgrace(source_p);
 
-       if(!IsChannelName(parv[1]))
+       if(!IsChannelName(name))
        {
                sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
-                                  form_str(ERR_NOSUCHCHANNEL), parv[1]);
+                                  form_str(ERR_NOSUCHCHANNEL), name);
                return 0;
        }
 
-       chptr = find_channel(parv[1]);
+       chptr = find_channel(name);
 
        if(chptr == NULL)
        {
                sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
-                               form_str(ERR_NOSUCHCHANNEL), parv[1]);
+                               form_str(ERR_NOSUCHCHANNEL), name);
                return 0;
        }
 
@@ -93,7 +111,7 @@ m_topic(struct Client *client_p, struct Client *source_p, int parc, const char *
                if(msptr == NULL)
                {
                        sendto_one_numeric(source_p, ERR_NOTONCHANNEL,
-                                       form_str(ERR_NOTONCHANNEL), parv[1]);
+                                       form_str(ERR_NOTONCHANNEL), name);
                        return 0;
                }
 
@@ -116,19 +134,22 @@ m_topic(struct Client *client_p, struct Client *source_p, int parc, const char *
                }
                else
                        sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
-                                       me.name, source_p->name, parv[1]);
+                                       me.name, source_p->name, name);
        }
        else if(MyClient(source_p))
        {
-               if(!IsMember(source_p, chptr) && SecretChannel(chptr))
+               if(operspy)
+                       report_operspy(source_p, "TOPIC", chptr->chname);
+               if(!IsMember(source_p, chptr) && SecretChannel(chptr) &&
+                               !operspy)
                {
                        sendto_one_numeric(source_p, ERR_NOTONCHANNEL,
-                                       form_str(ERR_NOTONCHANNEL), parv[1]);
+                                       form_str(ERR_NOTONCHANNEL), name);
                        return 0;
                }
                if(chptr->topic == NULL)
                        sendto_one(source_p, form_str(RPL_NOTOPIC),
-                                       me.name, source_p->name, parv[1]);
+                                       me.name, source_p->name, name);
                else
                {
                        sendto_one(source_p, form_str(RPL_TOPIC),