tidied up devnull management and prepared functions for coming "dynamic devnull"...
[srvx.git] / src / proto-p10.c
index f544f9f019a2ddc3799bb19de4e0dc013e0a982a..91247e251606f974d96be9bbb3755d4de2ed645b 100644 (file)
@@ -90,6 +90,7 @@
 #define CMD_SVSNICK             "SVSNICK"
 #define CMD_SVSMODE             "SVSMODE"
 #define CMD_SVSJOIN             "SVSJOIN"
+#define CMD_SVSPART             "SVSPART"
 #define CMD_TIME                "TIME"
 #define CMD_TOPIC               "TOPIC"
 #define CMD_TRACE               "TRACE"
 #define TOK_SVSNICK             "SN"
 #define TOK_SVSMODE             "SM"
 #define TOK_SVSJOIN             "SJ"
+#define TOK_SVSPART             "SP"
 #define TOK_TIME                "TI"
 #define TOK_TOPIC               "T"
 #define TOK_TRACE               "TR"
 #define P10_SVSNICK             TYPE(SVSNICK)
 #define P10_SVSMODE             TYPE(SVSMODE)
 #define P10_SVSJOIN             TYPE(SVSJOIN)
+#define P10_SVSPART             TYPE(SVSPART)
 #define P10_TIME                TYPE(TIME)
 #define P10_TOPIC               TYPE(TOPIC)
 #define P10_TRACE               TYPE(TRACE)
@@ -654,6 +657,18 @@ irc_svsjoinchan(struct userNode *from, struct userNode *user, const char *chan)
 putsock("%s " P10_SVSJOIN " %s %s", from->numeric, user->numeric, chan);
 }
 
+void
+irc_svspart(struct userNode *from, struct userNode *user, struct chanNode *chan)
+{
+putsock("%s " P10_SVSPART " %s %s", from->numeric, user->numeric, chan->name);
+}
+
+void
+irc_svspartchan(struct userNode *from, struct userNode *user, const char *chan)
+{
+putsock("%s " P10_SVSPART " %s %s", from->numeric, user->numeric, chan);
+}
+
 void
 irc_eob(void)
 {
@@ -1771,41 +1786,41 @@ static CMD_FUNC(cmd_relay)
         //ok  someone relayed something to us!
         if(strcmp("LQ", argv[2]) == 0) {
             //oooh thats exciting - we've got a LOC Query! :D
-            //LQ !ABADE pk910 80.153.5.212 server.zoelle1.de ~watchcat :test
             //ok  let's check the login datas
             struct handle_info *hi;
             char tmp[MAXLEN], tmp2[MAXLEN];
             sprintf(tmp, "%s@%s",argv[7],argv[6]);
             sprintf(tmp2, "%s@%s",argv[7],argv[5]);
             if((hi = checklogin(argv[4],argv[argc-1],&argv[3][1],tmp,tmp2))) {
-             //login ok
-             struct devnull_class *th;
-             char devnull[512];
-             if(hi->devnull && (th = devnull_get(hi->devnull))) {
-                const char *devnull_modes = DEVNULL_MODES;
-                int ii, flen;
-                char flags[50];
-                for (ii=flen=0; devnull_modes[ii]; ++ii)
-                    if (th->modes & (1 << ii))
-                        flags[flen++] = devnull_modes[ii];
-                flags[flen] = 0;
-                sprintf(devnull, "+%s %s %lu %lu",flags,th->name,th->maxchan,th->maxsendq);
-             } else {
-                devnull[0] = 0;
-             }
-             if(!HANDLE_FLAGGED(hi, AUTOHIDE)) {
-                sprintf(tmp,"%s LA %s 0 %s\n",argv[3],hi->handle,devnull);
-             } else if(getfakehost(argv[4])) {
-                sprintf(tmp,"%s LA %s %s %s\n",argv[3],hi->handle,getfakehost(argv[4]),devnull);
-             } else {
-                extern const char *hidden_host_suffix;
-                sprintf(tmp,"%s LA %s %s.%s %s\n",argv[3],hi->handle,hi->handle,hidden_host_suffix,devnull);
-             }
-             irc_relay(tmp);
+                //login ok
+                struct devnull_class th = devnull_user_get_class(hi);
+                char devnull[MAXLEN];
+                
+                if(th.modes) {
+                    const char *devnull_modes = DEVNULL_MODES;
+                    int ii, flen = 0;
+                    char flags[50];
+                    for (ii = 0; devnull_modes[ii]; ++ii)
+                        if(th.modes & (1 << ii))
+                            flags[flen++] = devnull_modes[ii];
+                    flags[flen] = 0;
+                    sprintf(devnull, "+%s %s %lu %lu", flags, (th.name ? th.name : "custom"), (DEVNULL_HAS_PRIV(&th, CHANLIMIT) ? th.maxchan : 0), (DEVNULL_HAS_PRIV(&th, MAXSENDQ) ? th.maxsendq : 0));
+                } else
+                    devnull[0] = 0;
+                
+                if(!HANDLE_FLAGGED(hi, AUTOHIDE))
+                    sprintf(tmp,"%s LA %s 0 %s\n",argv[3],hi->handle,devnull);
+                else if(getfakehost(argv[4]))
+                    sprintf(tmp,"%s LA %s %s %s\n",argv[3],hi->handle,getfakehost(argv[4]),devnull);
+                else {
+                    extern const char *hidden_host_suffix;
+                    sprintf(tmp,"%s LA %s %s.%s %s\n",argv[3],hi->handle,hi->handle,hidden_host_suffix,devnull);
+                }
+                irc_relay(tmp);
             } else {
-             //login rejected
-             sprintf(tmp,"%s LR\n",argv[3]);
-             irc_relay(tmp);
+                //login rejected
+                sprintf(tmp,"%s LR\n",argv[3]);
+                irc_relay(tmp);
             }
         } else if(strcmp("UC", argv[2]) == 0) {
             char tmp[MAXLEN];