]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/proto-common.c
more python work. Not safe to run yet
[irc/evilnet/x3.git] / src / proto-common.c
index 0254bbd91dce08071e6c5e82e1fb73496b139088..f9b30e7eda29cd3b2b1906599e36904b934ed0c8 100644 (file)
@@ -3,9 +3,9 @@
  *
  * This file is part of x3.
  *
- * srvx is free software; you can redistribute it and/or modify
+ * x3 is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
@@ -23,6 +23,7 @@
 #include "ioset.h"
 #include "log.h"
 #include "nickserv.h"
+#include "spamserv.h"
 #include "shun.h"
 #include "timeq.h"
 #ifdef HAVE_SYS_SOCKET_H
@@ -70,6 +71,7 @@ typedef void (*foreach_nonchan) (char *name, void *data);
 typedef void (*foreach_userfunc) (struct userNode *user, void *data);
 typedef void (*foreach_nonuser) (char *name, void *data);
 static void parse_foreach(char *target_list, foreach_chanfunc cf, foreach_nonchan nc, foreach_userfunc uf, foreach_nonuser nu, void *data);
+static void call_channel_mode_funcs(struct userNode *who, struct chanNode *channel, char **modes, unsigned int argc);
 
 static void
 uplink_readable(struct io_fd *fd) {
@@ -444,6 +446,8 @@ privmsg_chan_helper(struct chanNode *cn, void *data)
     if (!pd->is_notice && cf->func
         && ((cn->modes & MODE_REGISTERED) || GetUserMode(cn, cf->service)))
          cf->func(pd->user, cn, pd->text+1, cf->service);
+    else
+        spamserv_channel_message(cn, pd->user, pd->text);
 
     /* This catches *all* text sent to the channel that the services server sees */
     for (x = 0; x < ALLCHANMSG_FUNCS_MAX; x++) {
@@ -686,6 +690,9 @@ mod_chanmode(struct userNode *who, struct chanNode *channel, char **modes, unsig
         base_oplevel = MAXOPLEVEL;
     if (!(change = mod_chanmode_parse(channel, modes, argc, flags, base_oplevel)))
         return 0;
+
+    call_channel_mode_funcs(who, channel, modes, argc);
+
     if (flags & MC_ANNOUNCE)
         mod_chanmode_announce(who, channel, change);
     else
@@ -710,6 +717,84 @@ irc_make_chanmode(struct chanNode *chan, char *out)
     return strlen(mod_chanmode_format(&change, out));
 }
 
+static user_mode_func_t *um_list;
+static unsigned int um_size = 0, um_used = 0;
+
+void
+reg_user_mode_func(user_mode_func_t handler)
+{
+       if (um_used == um_size) {
+               if (um_size) {
+                       um_size <<= 1;
+                       um_list = realloc(um_list, um_size*sizeof(user_mode_func_t));
+               } else {
+                       um_size = 8;
+                       um_list = malloc(um_size*sizeof(user_mode_func_t));
+               }
+       }
+       um_list[um_used++] = handler;
+}
+
+void
+unreg_user_mode_func(user_mode_func_t handler)
+{
+       unsigned int i;
+       for (i=0; i<um_used; i++) {
+               if (um_list[i] == handler) break;
+       }
+       if (i == um_used) return;
+       memmove(um_list+i, um_list+i+1, (um_used-i-1)*sizeof(um_list[0]));
+       um_used--;
+}
+
+static void
+call_user_mode_funcs(struct userNode *user, const char *mode_change)
+{
+       unsigned int n;
+       for (n=0; n<um_used; n++) {
+               um_list[n](user, mode_change);
+       }
+}
+
+static channel_mode_func_t *cm_list;
+static unsigned int cm_size = 0, cm_used = 0;
+
+void
+reg_channel_mode_func(channel_mode_func_t handler)
+{
+       if (cm_used == cm_size) {
+               if (cm_size) {
+                       cm_size <<= 1;
+                       cm_list = realloc(cm_list, cm_size*sizeof(channel_mode_func_t));
+               } else {
+                       cm_size = 8;
+                       cm_list = malloc(cm_size*sizeof(channel_mode_func_t));
+               }
+       }
+       cm_list[cm_used++] = handler;
+}
+
+void
+unreg_channel_mode_func(channel_mode_func_t handler)
+{
+       unsigned int i;
+       for (i=0; i<cm_used; i++) {
+               if(cm_list[i] == handler) break;
+       }
+       if (i == cm_used) return;
+       memmove(cm_list+i, cm_list+i+1, (cm_used-i-1)*sizeof(cm_list[0]));
+       cm_used--;
+}
+
+static void
+call_channel_mode_funcs(struct userNode *who, struct chanNode *channel, char **modes, unsigned int argc)
+{
+       unsigned int n;
+       for (n=0; n<cm_used; n++) {
+               cm_list[n](who, channel, modes, argc);
+       }
+}
+
 char *
 generate_hostmask(struct userNode *user, int options)
 {
@@ -749,9 +834,20 @@ generate_hostmask(struct userNode *user, int options)
     hostname = user->hostname;
     if (IsFakeHost(user) && IsHiddenHost(user) && !(options & GENMASK_NO_HIDING)) {
         hostname = user->fakehost;
-    } else if (IsHiddenHost(user) && user->handle_info && hidden_host_suffix && !(options & GENMASK_NO_HIDING)) {
-        hostname = alloca(strlen(user->handle_info->handle) + strlen(hidden_host_suffix) + 2);
-        sprintf(hostname, "%s.%s", user->handle_info->handle, hidden_host_suffix);
+    } else if (IsHiddenHost(user)) {
+        int style = 1;
+        char *data;
+        data = conf_get_data("server/hidden_host_type", RECDB_QSTRING);
+        if (data)
+            style = atoi(data);
+
+        if ((style == 1) && user->handle_info && hidden_host_suffix && !(options & GENMASK_NO_HIDING)) {
+            hostname = alloca(strlen(user->handle_info->handle) + strlen(hidden_host_suffix) + 2);
+            sprintf(hostname, "%s.%s", user->handle_info->handle, hidden_host_suffix);
+        } else if ((style == 2) && !(options & GENMASK_NO_HIDING)) {
+            hostname = alloca(strlen(user->crypthost));
+            sprintf(hostname, "%s", user->crypthost);
+        }
     } else if (options & GENMASK_STRICT_HOST) {
         if (options & GENMASK_BYIP)
             hostname = (char*)irc_ntoa(&user->ip);