]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/proto-p10.c
oops. fixing debug message
[irc/evilnet/x3.git] / src / proto-p10.c
index 769387e4d529d347702df6f4897053424ba36bea..608db6be4e36796a0c48b534a67e37c819ef14dc 100644 (file)
@@ -93,7 +93,9 @@
 #define CMD_SQUERY              "SQUERY"
 #define CMD_SQUIT               "SQUIT"
 #define CMD_STATS               "STATS"
+#define CMD_SVSJOIN             "SVSJOIN"
 #define CMD_SVSNICK             "SVSNICK"
+#define CMD_SVSPART             "SVSPART"
 #define CMD_SWHOIS              "SWHOIS"
 #define CMD_TIME                "TIME"
 #define CMD_TOPIC               "TOPIC"
 #define TOK_SQUERY              "SQUERY"
 #define TOK_SQUIT               "SQ"
 #define TOK_STATS               "R"
+#define TOK_SVSJOIN             "SJ"
 #define TOK_SVSNICK             "SN"
+#define TOK_SVSPART             "SP"
 #define TOK_SWHOIS              "SW"
 #define TOK_TIME                "TI"
 #define TOK_TOPIC               "T"
 #define P10_SQUERY              TYPE(SQUERY)
 #define P10_SQUIT               TYPE(SQUIT)
 #define P10_STATS               TYPE(STATS)
+#define P10_SVSJOIN             TYPE(SVSJOIN)
 #define P10_SVSNICK             TYPE(SVSNICK)
+#define P10_SVSPART             TYPE(SVSPART)
 #define P10_SWHOIS              TYPE(SWHOIS)
 #define P10_TIME                TYPE(TIME)
 #define P10_TOPIC               TYPE(TOPIC)
@@ -374,6 +380,32 @@ GetUserN(const char *numeric) /* using numeric */
     return un;
 }
 
+extern struct userNode *opserv;
+static void
+check_ctcp(struct userNode *user, struct userNode *bot, char *text, UNUSED_ARG(int server_qualified))
+{
+    char *cmd;
+    /* if its a version reply, do an alert check (only alerts with version=something) */
+    if(bot == opserv) {
+        if(text[0] == '\001') {
+            text++;
+            cmd = mysep(&text, " ");
+            if(!irccasecmp(cmd, "VERSION")) {
+                char *version = mysep(&text, "\n");
+                if(!version)
+                    version = "";
+                /* opserv_debug("Opserv got CTCP VERSION Notice from %s: %s", user->nick, version); */
+                /* TODO: setup a ctcp_funcs thing to handle this and other CTCPS properly */
+                user->version_reply = strdup(version);
+                /* TODO: put this in the db */
+                if(match_ircglob(version, "WebTV;*"))
+                    user->no_notice = true; /* webbies cant see notices */
+            }
+        }
+    }
+}
+
+
 static void
 privmsg_user_helper(struct userNode *un, void *data)
 {
@@ -385,6 +417,7 @@ privmsg_user_helper(struct userNode *un, void *data)
         }
     } else {
         if ((num < num_notice_funcs) && notice_funcs[num]) {
+            check_ctcp(pd->user, un, pd->text, pd->is_qualified);
             notice_funcs[num](pd->user, un, pd->text, pd->is_qualified);
         }
     }
@@ -656,6 +689,7 @@ irc_wallops(const char *format, ...)
     putsock("%s " P10_WALLOPS " :%s", self->numeric, buffer);
 }
 
+
 void
 irc_notice(struct userNode *from, const char *to, const char *message)
 {
@@ -674,6 +708,18 @@ irc_privmsg(struct userNode *from, const char *to, const char *message)
     putsock("%s " P10_PRIVMSG " %s :%s", from->numeric, to, message);
 }
 
+void
+irc_privmsg_user(struct userNode *from, struct userNode *to, const char *message)
+{
+    putsock("%s " P10_PRIVMSG " %s :%s", from->numeric, to->numeric, message);
+}
+
+void 
+irc_version_user(struct userNode *from, struct userNode *to)
+{
+    irc_privmsg_user(from, to, "\001VERSION\001");
+}
+
 void
 irc_eob(void)
 {
@@ -950,6 +996,18 @@ irc_join(struct userNode *who, struct chanNode *what)
     }
 }
 
+void
+irc_svsjoin(struct userNode *from, struct userNode *who, struct chanNode *to)
+{
+    putsock("%s " P10_SVSJOIN " %s %s "FMT_TIME_T, from->uplink->numeric, who->numeric, to->name, now);
+}
+
+void
+irc_svspart(struct userNode *from, struct userNode *who, struct chanNode *to)
+{
+    putsock("%s " P10_SVSPART " %s %s", from->uplink->numeric, who->numeric, to->name);
+}
+
 void
 irc_kick(struct userNode *who, struct userNode *target, struct chanNode *channel, const char *msg)
 {
@@ -1026,7 +1084,7 @@ irc_topic(struct userNode *service, struct userNode *who, struct chanNode *what,
       host_in_topic = atoi(hstr);
    }
 
-   if (type == 5) {
+   if (type >= 5) {
      putsock("%s " P10_TOPIC " %s %s%s%s%s%s " FMT_TIME_T " " FMT_TIME_T " :%s", service->numeric, what->name,
              who->nick, host_in_topic ? "!" : "", host_in_topic ? (IsSetHost(who) ? sident : who->ident) : "", 
              host_in_topic ? "@" : "", host_in_topic ? shost : "", what->timestamp, now, topic);
@@ -1176,7 +1234,8 @@ static CMD_FUNC(cmd_eob)
         /* now that we know who our uplink is,
          * we can center the routing map and activate auto-routing.
          */
-        activate_routing(NULL, NULL, NULL);
+        //activate_routing(NULL, NULL, NULL);
+        routing_init();
     }
     sender->self_burst = 0;
     recalc_bursts(sender);
@@ -1286,6 +1345,22 @@ static CMD_FUNC(cmd_join)
     return 1;
 }
 
+static CMD_FUNC(cmd_svsjoin)
+{
+    struct create_desc cd;
+
+    if (!(cd.user = GetUserH(argv[1])))
+        return 0;
+    if (argc < 3)
+        return 0;
+    else if (argc < 4)
+        cd.when = now;
+    else
+        cd.when = atoi(argv[3]);
+    parse_foreach(argv[2], join_helper, create_helper, NULL, NULL, &cd);
+    return 1;
+}
+
 static CMD_FUNC(cmd_pong)
 {
     if (argc < 3)
@@ -1870,6 +1945,19 @@ static CMD_FUNC(cmd_part)
     return 1;
 }
 
+static CMD_FUNC(cmd_svspart)
+{
+    struct userNode *user;
+
+    if (argc < 3)
+        return 0;
+    user = GetUserH(argv[1]);
+    if (!user)
+        return 0;
+    parse_foreach(argv[2], part_helper, NULL, NULL, NULL, user);
+    return 1;
+}
+
 static CMD_FUNC(cmd_silence)
 {
     struct userNode *user;
@@ -2210,8 +2298,12 @@ init_parse(void)
     dict_insert(irc_func_dict, TOK_NOTICE, cmd_notice);
     dict_insert(irc_func_dict, CMD_STATS, cmd_stats);
     dict_insert(irc_func_dict, TOK_STATS, cmd_stats);
+    dict_insert(irc_func_dict, CMD_SVSJOIN, cmd_svsjoin);
+    dict_insert(irc_func_dict, TOK_SVSJOIN, cmd_svsjoin);
     dict_insert(irc_func_dict, CMD_SVSNICK, cmd_svsnick);
     dict_insert(irc_func_dict, TOK_SVSNICK, cmd_svsnick);
+    dict_insert(irc_func_dict, CMD_SVSPART, cmd_svspart);
+    dict_insert(irc_func_dict, TOK_SVSPART, cmd_svspart);
     dict_insert(irc_func_dict, CMD_SWHOIS, cmd_dummy);
     dict_insert(irc_func_dict, TOK_SWHOIS, cmd_dummy);
     dict_insert(irc_func_dict, CMD_WHOIS, cmd_whois);
@@ -2302,6 +2394,7 @@ init_parse(void)
     userList_init(&dead_users);
     reg_del_channel_func(remove_unbursted_channel);
     reg_exit_func(parse_cleanup);
+    // reg_notice_func(opserv, check_ctcp);
 }
 
 int
@@ -2630,6 +2723,9 @@ AddUser(struct server* uplink, const char *nick, const char *ident, const char *
       make_ipv6virthost((char*)irc_ntoa(&uNode->ip), uNode->hostname, uNode->crypthost);
     }
 
+    if (!uNode->crypthost && uNode->cryptip)
+        snprintf(uNode->crypthost, sizeof(uNode->crypthost), "%s", strdup(uNode->cryptip));
+
     uNode->timestamp = timestamp;
     modeList_init(&uNode->channels);
     uNode->uplink = uplink;
@@ -2704,6 +2800,19 @@ DelUser(struct userNode* user, struct userNode *killer, int announce, const char
     }
 
     modeList_clean(&user->channels);
+
+    /* Clean up version data */
+    if(user->version_reply) {
+        free(user->version_reply);
+        user->version_reply = NULL;
+    }
+
+    /* clean up geoip data if any */
+    if(user->country_code) free(user->country_code);
+    if(user->city) free(user->city);
+    if(user->region) free(user->region);
+    if(user->postal_code) free(user->postal_code);
+
     /* We don't free them, in case we try to privmsg them or something
      * (like when a stupid oper kills themself).  We just put them onto
      * a list of clients that get freed after processing each line.