]> jfr.im git - solanum.git/blobdiff - modules/m_topic.c
Add target change for channels.
[solanum.git] / modules / m_topic.c
index a69a99e29d5b47271a1b7e5650cf24600ee94b99..cf7b28530999289b88c161b9677a9f5240f94d95 100644 (file)
@@ -39,6 +39,7 @@
 #include "parse.h"
 #include "modules.h"
 #include "packet.h"
+#include "tgchange.h"
 
 static int m_topic(struct Client *, struct Client *, int, const char **);
 static int ms_topic(struct Client *, struct Client *, int, const char **);
@@ -53,7 +54,6 @@ DECLARE_MODULE_AV1(topic, NULL, NULL, topic_clist, NULL, NULL, "$Revision: 254 $
 
 /*
  * m_topic
- *      parv[0] = sender prefix
  *      parv[1] = channel name
  *     parv[2] = new topic, if setting topic
  */
@@ -115,7 +115,19 @@ m_topic(struct Client *client_p, struct Client *source_p, int parc, const char *
                        return 0;
                }
 
-               if((chptr->mode.mode & MODE_TOPICLIMIT) == 0 || is_chanop(msptr))
+               if(MyClient(source_p) && !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(((chptr->mode.mode & MODE_TOPICLIMIT) == 0 ||
+                                       is_chanop(msptr)) &&
+                               (!MyClient(source_p) ||
+                                can_send(chptr, source_p, msptr)))
                {
                        char topic_info[USERHOST_REPLYLEN];
                        rb_sprintf(topic_info, "%s!%s@%s",
@@ -134,7 +146,8 @@ 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, name);
+                                       get_id(&me, source_p),
+                                       get_id(source_p, source_p), name);
        }
        else if(MyClient(source_p))
        {
@@ -166,7 +179,6 @@ m_topic(struct Client *client_p, struct Client *source_p, int parc, const char *
 
 /*
  * ms_topic
- *      parv[0] = sender prefix
  *      parv[1] = channel name
  *     parv[2] = topic_info
  *     parv[3] = topic_info time