Jelajahi Sumber

* Utilize CPRIVMSG/CNOTICE if available

Bryan Drewery 16 tahun lalu
induk
melakukan
78ab9aeee6

+ 1 - 0
doc/UPDATES

@@ -3,6 +3,7 @@
 * Add set 'msgburst' to define how many commands to burst to server per msgrate.
 * On hybrid/ratbox servers, burst some commands on connect
 * Add cmd_play for playing files to irc. (ASCII art gallery exhibition)
+* Utilize CPRIVMSG/CNOTICE if available.
 
 1.2.17 - http://wraith.botpack.net/milestone/1.2.17
 * Binary / shell / startup changes

+ 25 - 2
src/chanprog.c

@@ -33,6 +33,7 @@
 #include "common.h"
 #include "chanprog.h"
 #include "settings.h"
+#include "src/mod/irc.mod/irc.h"
 #include "src/mod/channels.mod/channels.h"
 #include "src/mod/server.mod/server.h"
 #include "src/mod/share.mod/share.h"
@@ -944,10 +945,32 @@ samechans(const char *nick, const char *delim)
   return ret;
 }
 
+struct chanset_t* find_common_opped_chan(const char* nick) {
+  for (struct chanset_t* chan = chanset; chan; chan = chan->next) {
+    if (channel_active(chan) && (me_op(chan) || me_voice(chan))) {
+      if (ismember(chan, nick))
+        return chan;
+    }
+  }
+  return NULL;
+}
+
 void privmsg(const char* target, const char* msg, int idx) {
-  dprintf(idx, "PRIVMSG %s :%s\n", target, msg);
+  struct chanset_t* chan = NULL;
+  if (have_cprivmsg && !strchr(CHANMETA, target[0]))
+    chan = find_common_opped_chan(target);
+  if (chan)
+    dprintf(idx, "CPRIVMSG %s %s :%s\n", target, chan->name, msg);
+  else
+    dprintf(idx, "PRIVMSG %s :%s\n", target, msg);
 }
 
 void notice(const char* target, const char* msg, int idx) {
-  dprintf(idx, "NOTICE %s :%s\n", target, msg);
+  struct chanset_t* chan = NULL;
+  if (have_cnotice && !strchr(CHANMETA, target[0]))
+    chan = find_common_opped_chan(target);
+  if (chan)
+    dprintf(idx, "CNOTICE %s %s :%s\n", target, chan->name, msg);
+  else
+    dprintf(idx, "NOTICE %s :%s\n", target, msg);
 }

+ 1 - 1
src/mod/irc.mod/irc.c

@@ -1257,7 +1257,7 @@ me_op(struct chanset_t *chan)
 
 /* Check whether I'm voice. Returns boolean 1 or 0.
  */
-static bool
+bool
 me_voice(struct chanset_t *chan)
 {
   memberlist *mx = ismember(chan, botname);

+ 1 - 1
src/mod/irc.mod/irc.h

@@ -66,7 +66,6 @@ static void cache_invite(struct chanset_t *, char *, char *, char *, bool, bool)
 void makecookie(char*, size_t, const char *, const memberlist*, const memberlist*, const memberlist* = NULL, const memberlist* = NULL);
 static int checkcookie(const char*, const memberlist*, const memberlist*, const char*, int);
 extern void counter_clear(const char*);
-static bool me_voice(struct chanset_t *);
 static bool any_ops(struct chanset_t *);
 static char *getchanmode(struct chanset_t *);
 static void flush_mode(struct chanset_t *, int);
@@ -113,6 +112,7 @@ void real_add_mode(struct chanset_t *, const char, const char, const char *, boo
 #define add_mode(chan, pls, mode, nick) real_add_mode(chan, pls, mode, nick, 0)
 #define add_cookie(chan, nick) real_add_mode(chan, '+', 'o', nick, 1)
 bool me_op(struct chanset_t *);
+bool me_voice(struct chanset_t *);
 
 void check_this_ban(struct chanset_t *, char *, bool);
 void check_this_exempt(struct chanset_t *, char *, bool);

+ 2 - 0
src/mod/server.mod/server.c

@@ -99,6 +99,8 @@ static egg_timeval_t flood_time = {0, 0};
 static bool use_penalties;
 static int use_fastdeq;
 size_t nick_len = 9;			/* Maximal nick length allowed on the network. */
+bool have_cprivmsg = 0;
+bool have_cnotice = 0;
 
 static bool double_warned = 0;
 

+ 1 - 1
src/mod/server.mod/server.h

@@ -48,7 +48,7 @@ enum {
 
 extern bind_table_t	*BT_ctcp, *BT_ctcr, *BT_msgc;
 extern size_t		nick_len;
-extern bool		trigger_on_ignore, floodless, tried_jupenick, keepnick;
+extern bool		trigger_on_ignore, floodless, tried_jupenick, keepnick, have_cprivmsg, have_cnotice;
 extern int 		servidx, ctcp_mode, answer_ctcp, serv, curserv, default_alines;
 extern unsigned int     rolls;
 extern port_t		default_port, newserverport, curservport;

+ 6 - 0
src/mod/server.mod/servmsg.c

@@ -331,6 +331,10 @@ got005(char *from, char *msg)
       use_354 = 1;
     else if (!strcasecmp(tmp, "EXCEPTS"))
       use_exempts = 1;
+    else if (!strcasecmp(tmp, "CPRIVMSG"))
+      have_cprivmsg = 1;
+    else if (!strcasecmp(tmp, "CNOTICE"))
+      have_cnotice = 1;
     else if (!strcasecmp(tmp, "INVEX"))
       use_invites = 1;
     else if (!strcasecmp(tmp, "MAXBANS")) {
@@ -1165,6 +1169,8 @@ static void disconnect_server(int idx, int dolost)
   floodless = 0;
   botuserhost[0] = 0;
   botuserip[0] = 0; 
+  have_cprivmsg = 0;
+  have_cnotice = 0;
   if (dolost) {
     Auth::DeleteAll();
     trying_server = 0;