general P10_RELAY, P10_SVSMODE & P10_SVSJOIN support
authorpk910 <philipp@zoelle1.de>
Thu, 7 Jul 2011 20:50:19 +0000 (22:50 +0200)
committerpk910 <philipp@zoelle1.de>
Thu, 7 Jul 2011 20:50:19 +0000 (22:50 +0200)
src/proto-p10.c
src/proto.h

index e29db35e6d42aab48d0c51c2daadea4fa3c01efe..278762f34535c6d7a304eff256cedbc5a7dad97f 100644 (file)
@@ -72,6 +72,7 @@
 #define CMD_PROTO               "PROTO"
 #define CMD_QUIT                "QUIT"
 #define CMD_REHASH              "REHASH"
+#define CMD_RELAY               "RELAY"
 #define CMD_RESET               "RESET"
 #define CMD_RESTART             "RESTART"
 #define CMD_RPING               "RPING"
@@ -86,6 +87,8 @@
 #define CMD_SQUIT               "SQUIT"
 #define CMD_STATS               "STATS"
 #define CMD_SVSNICK             "SVSNICK"
+#define CMD_SVSMODE             "SVSMODE"
+#define CMD_SVSJOIN             "SVSJOIN"
 #define CMD_TIME                "TIME"
 #define CMD_TOPIC               "TOPIC"
 #define CMD_TRACE               "TRACE"
 #define TOK_PROTO               "PROTO"
 #define TOK_QUIT                "Q"
 #define TOK_REHASH              "REHASH"
+#define TOK_RELAY               "RL"
 #define TOK_RESET               "RESET"
 #define TOK_RESTART             "RESTART"
 #define TOK_RPING               "RI"
 #define TOK_SQUIT               "SQ"
 #define TOK_STATS               "R"
 #define TOK_SVSNICK             "SN"
+#define TOK_SVSMODE             "SM"
+#define TOK_SVSJOIN             "SJ"
 #define TOK_TIME                "TI"
 #define TOK_TOPIC               "T"
 #define TOK_TRACE               "TR"
 #define P10_PROTO               TYPE(PROTO)
 #define P10_QUIT                TYPE(QUIT)
 #define P10_REHASH              TYPE(REHASH)
+#define P10_RELAY               TYPE(RELAY)
 #define P10_RESET               TYPE(RESET)
 #define P10_RESTART             TYPE(RESTART)
 #define P10_RPING               TYPE(RPING)
 #define P10_SQUIT               TYPE(SQUIT)
 #define P10_STATS               TYPE(STATS)
 #define P10_SVSNICK             TYPE(SVSNICK)
+#define P10_SVSMODE             TYPE(SVSMODE)
+#define P10_SVSJOIN             TYPE(SVSJOIN)
 #define P10_TIME                TYPE(TIME)
 #define P10_TOPIC               TYPE(TOPIC)
 #define P10_TRACE               TYPE(TRACE)
@@ -496,6 +505,19 @@ irc_fakehost(struct userNode *user, const char *host, const char *ident, int for
     putsock("%s " P10_FAKEHOST " %s %s %s%s", self->numeric, user->numeric, ident, host, force ? " FORCE" : "");
 }
 
+void 
+irc_relay(char *message)
+{
+    putsock("%s " P10_RELAY " %s", self->numeric, message);
+    fprintf(stderr,"%s " P10_RELAY " %s", self->numeric, message);
+}
+
+void 
+irc_simul(struct userNode *target, char *command)
+{
+    putsock("%s " P10_RELAY " %s SI %s :%s", self->numeric, target->numeric, target->numeric, command);
+}
+
 void
 irc_regnick(UNUSED_ARG(struct userNode *user))
 {
@@ -594,6 +616,24 @@ irc_privmsg(struct userNode *from, const char *to, const char *message)
         putsock("%s " P10_PRIVMSG " %s :%s", from->numeric, to, message);
 }
 
+void
+irc_svsmode(struct userNode *from, struct userNode *user, const char *modes)
+{
+putsock("%s " P10_SVSMODE " %s %s", from->numeric, user->numeric, modes);
+}
+
+void
+irc_svsjoin(struct userNode *from, struct userNode *user, struct chanNode *chan)
+{
+putsock("%s " P10_SVSJOIN " %s %s", from->numeric, user->numeric, chan->name);
+}
+
+void
+irc_svsjoinchan(struct userNode *from, struct userNode *user, const char *chan)
+{
+putsock("%s " P10_SVSJOIN " %s %s", from->numeric, user->numeric, chan);
+}
+
 void
 irc_eob(void)
 {
@@ -675,6 +715,7 @@ void
 irc_ungline(const char *mask)
 {
     putsock("%s " P10_GLINE " * -%s %lu", self->numeric, mask, now);
+    //putsock("%s " P10_GLINE " * %s * %lu", self->numeric, mask, now);
 }
 
 /* Return negative if *(struct modeNode**)pa is "less than" pb,
@@ -1668,6 +1709,39 @@ static CMD_FUNC(cmd_time)
     return 1;
 }
 
+static CMD_FUNC(cmd_relay)
+{
+    struct server *sNode;
+    unsigned int len;
+    char buf[3];
+    //<sender> RELAY <destination> <command>
+    len = strlen(argv[1]);
+    buf[2] = 0;
+    switch(len) {
+        case 2:
+            sNode = GetServerN(argv[1]);
+            break;
+        case 5:
+            buf[0] = argv[1][0];
+            buf[1] = argv[1][1];
+            sNode = GetServerN(buf);
+            break;
+        case 6:
+            buf[0] = argv[1][1];
+            buf[1] = argv[1][2];
+            sNode = GetServerN(buf);
+            break;
+        default:
+            /* Invalid destination. Ignore. */
+            return 0;
+    }
+    if(sNode->numeric == self->numeric) {
+        //ok  someone relayed something to us!
+        
+    }
+    return 1;
+}
+
 void
 free_user(struct userNode *user)
 {
@@ -1795,6 +1869,8 @@ init_parse(void)
     dict_insert(irc_func_dict, TOK_STATS, cmd_stats);
     dict_insert(irc_func_dict, CMD_SVSNICK, cmd_svsnick);
     dict_insert(irc_func_dict, TOK_SVSNICK, cmd_svsnick);
+    dict_insert(irc_func_dict, CMD_RELAY, cmd_relay);
+    dict_insert(irc_func_dict, TOK_RELAY, cmd_relay);
     dict_insert(irc_func_dict, CMD_WHOIS, cmd_whois);
     dict_insert(irc_func_dict, TOK_WHOIS, cmd_whois);
     dict_insert(irc_func_dict, CMD_GLINE, cmd_gline);
index 92bd7ed6ed37177c3825a39bf65bfc56684e5484..a2e03a1ffe5132ee26eabf2fc4868fa07c1651ec 100644 (file)
@@ -148,6 +148,13 @@ void irc_account(struct userNode *user, const char *stamp, unsigned long timesta
 void irc_regnick(struct userNode *user);
 void irc_fakehost(struct userNode *user, const char *host, const char *ident, int force);
 
+/* svs maintenance */
+void irc_svsmode(struct userNode *from, struct userNode *user, const char *modes);
+void irc_svsjoin(struct userNode *from, struct userNode *user, struct chanNode *chan);
+void irc_svsjoinchan(struct userNode *from, struct userNode *user, const char *chan);
+void irc_relay(char *message);
+void irc_simul(struct userNode *target, char *command);
+
 /* numeric messages */
 void irc_numeric(struct userNode *user, unsigned int num, const char *format, ...);
 /* RFC1459-compliant numeric responses */