]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/proto-p10.c
Added back missing comment to example config
[irc/evilnet/x3.git] / src / proto-p10.c
index d611d98839ed0baef73e04542b6083d9598f06ba..580cbc5e1f1a526960791ece1675926d8fe7706a 100644 (file)
@@ -18,6 +18,7 @@
  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
  */
 
+#include "nickserv.h"
 #include "chanserv.h"
 #include "proto-common.c"
 
@@ -83,6 +84,7 @@
 #define CMD_SERVSET             "SERVSET"
 #define CMD_SET                        "SET"
 #define CMD_SETTIME             "SETTIME"
+#define CMD_SHUN               "SHUN"
 #define CMD_SILENCE             "SILENCE"
 #define CMD_SQUERY              "SQUERY"
 #define CMD_SQUIT               "SQUIT"
 #define TOK_SERVSET             "SERVSET"
 #define TOK_SET                        "SET"
 #define TOK_SETTIME             "SE"
+#define TOK_SHUN               "SU"
 #define TOK_SILENCE             "U"
 #define TOK_SQUERY              "SQUERY"
 #define TOK_SQUIT               "SQ"
 #define P10_SERVSET             TYPE(SERVSET)
 #define P10_SET                        TYPE(SET)
 #define P10_SETTIME             TYPE(SETTIME)
+#define P10_SHUN               TYPE(SHUN)
 #define P10_SILENCE             TYPE(SILENCE)
 #define P10_SQUERY              TYPE(SQUERY)
 #define P10_SQUIT               TYPE(SQUIT)
@@ -302,6 +306,7 @@ static unsigned int num_notice_funcs;
 static struct dict *unbursted_channels;
 static char *his_servername;
 static char *his_servercomment;
+static int extended_accounts;
 
 static struct userNode *AddUser(struct server* uplink, const char *nick, const char *ident, const char *hostname, const char *modes, const char *numeric, const char *userinfo, time_t timestamp, const char *realip);
 
@@ -430,10 +435,27 @@ irc_user(struct userNode *user)
     }
 }
 
+void
+irc_rename(struct userNode *user, const char *new_handle)
+{
+    if(extended_accounts)
+        putsock("%s " P10_ACCOUNT " %s M %s", self->numeric, user->numeric, new_handle);
+}
+
+void
+irc_delete(struct userNode *user)
+{
+    if(extended_accounts)
+        putsock("%s " P10_ACCOUNT " %s U", self->numeric, user->numeric);
+}
+
 void
 irc_account(struct userNode *user, const char *stamp, time_t timestamp)
 {
-    putsock("%s " P10_ACCOUNT " %s R %s %lu", self->numeric, user->numeric, stamp, timestamp);
+    if(extended_accounts)
+        putsock("%s " P10_ACCOUNT " %s R %s %lu", self->numeric, user->numeric, stamp, timestamp); 
+    else
+        putsock("%s " P10_ACCOUNT " %s %s %lu", self->numeric, user->numeric, stamp, timestamp);
 }
 
 void
@@ -557,10 +579,17 @@ irc_introduce(const char *passwd)
 }
 
 void
-irc_gline(struct server *srv, struct gline *gline)
+irc_gline(struct server *srv, struct gline *gline, int silent)
 {
-    putsock("%s " P10_GLINE " %s +%s %ld :<%s> %s",
-            self->numeric, (srv ? srv->numeric : "*"), gline->target, gline->expires-now, gline->issuer, gline->reason);
+    putsock("%s " P10_GLINE " %s +%s %ld :%s<%s> %s",
+            self->numeric, (srv ? srv->numeric : "*"), gline->target, gline->expires-now, silent ? "AUTO " : "", gline->issuer, gline->reason);
+}
+
+void
+irc_shun(struct server *srv, struct shun *shun)
+{
+    putsock("%s " P10_SHUN " %s +%s %ld :<%s> %s",
+            self->numeric, (srv ? srv->numeric : "*"), shun->target, shun->expires-now, shun->issuer, shun->reason);
 }
 
 void
@@ -578,6 +607,12 @@ irc_ungline(const char *mask)
     putsock("%s " P10_GLINE " * -%s", self->numeric, mask);
 }
 
+void
+irc_unshun(const char *mask)
+{
+    putsock("%s " P10_SHUN " * -%s", self->numeric, mask);
+}
+
 static void
 irc_burst(struct chanNode *chan)
 {
@@ -714,6 +749,16 @@ irc_mode(struct userNode *from, struct chanNode *target, const char *modes)
             target->name, modes, target->timestamp);
 }
 
+/* Added to allow services to mode users
+   2005 - 8 - 10 by Life4Christ
+*/
+void
+irc_umode(struct userNode *target, const char *modes)
+{
+    putsock("%s " P10_MODE " %s %s ",self->numeric,target->nick, modes);
+}
+
+
 void
 irc_invite(struct userNode *from, struct userNode *who, struct chanNode *to)
 {
@@ -764,8 +809,14 @@ irc_part(struct userNode *who, struct chanNode *what, const char *reason)
 }
 
 void
-irc_topic(struct userNode *who, struct chanNode *what, const char *topic)
+irc_topic(struct userNode *service, struct userNode *who, struct chanNode *what, const char *topic)
 {
+/* UNCOMMENT FOR NEFARIOUS 0.5.0 TOPIC SUPPORT
+ *    putsock("%s " P10_TOPIC " %s %s " FMT_TIME_T " " FMT_TIME_T " :%s", service->numeric, what->name, who->nick, what->timestamp, now, topic);
+ * UNCOMMENT FOR NEFARIOUS 0.5.0 TOPIC SUPPORT */
+
+    who = service; /* REMOVE LINE FOR NEFARIOUS 0.5.0 */
+
     putsock("%s " P10_TOPIC " %s :%s", who->numeric, what->name, topic);
 }
 
@@ -1058,6 +1109,9 @@ static CMD_FUNC(cmd_account)
     user = GetUserN(argv[1]);
     if (!user)
         return 1; /* A QUIT probably passed the ACCOUNT. */
+
+    if(!extended_accounts) /* any need for this function without? */
+        return 1;
     
     if(!strcmp(argv[2],"C"))
     {
@@ -1317,6 +1371,7 @@ static CMD_FUNC(cmd_topic)
 {
     struct chanNode *cn;
     time_t chan_ts, topic_ts;
+    struct userNode *user;
 
     if (argc < 3)
         return 0;
@@ -1324,15 +1379,23 @@ static CMD_FUNC(cmd_topic)
         log_module(MAIN_LOG, LOG_ERROR, "Unable to find channel %s whose topic is being set", argv[1]);
         return 0;
     }
-    if (argc >= 5) {
-        /* Looks like an Asuka style topic burst. */
+
+
+    if (argc == 5) {              /* Asuka / Topic Bursting IRCu's */
+        user = GetUserH(origin);
         chan_ts = atoi(argv[2]);
         topic_ts = atoi(argv[3]);
-    } else {
+    } else if (argc >= 6) {       /* Nefarious 0.5.0 */
+        user = GetUserH(strtok(argv[2], "!"));
+        chan_ts = atoi(argv[3]);
+        topic_ts = atoi(argv[4]);
+    } else {                      /* Regular IRCu (No Topic Bursting)*/
+        user = GetUserH(origin);
         chan_ts = cn->timestamp;
         topic_ts = now;
     }
-    SetChannelTopic(cn, GetUserH(origin), argv[argc-1], 0);
+
+    SetChannelTopic(cn, user, user, argv[argc-1], 0);
     cn->topic_time = topic_ts;
     return 1;
 }
@@ -1377,7 +1440,15 @@ static CMD_FUNC(cmd_num_gline)
 {
     if (argc < 6)
         return 0;
-    gline_add(origin, argv[3], atoi(argv[4])-now, argv[5], now, 0);
+    gline_add(origin, argv[3], atoi(argv[4])-now, argv[5], now, 0, 0);
+    return 1;
+}
+
+static CMD_FUNC(cmd_num_shun)
+{
+    if (argc < 6)
+        return 0;
+    shun_add(origin, argv[3], atoi(argv[4])-now, argv[5], now, 0);
     return 1;
 }
 
@@ -1510,7 +1581,7 @@ static CMD_FUNC(cmd_gline)
     if (argv[2][0] == '+') {
         if (argc < 5)
             return 0;
-        gline_add(origin, argv[2]+1, strtoul(argv[3], NULL, 0), argv[argc-1], now, 0);
+        gline_add(origin, argv[2]+1, strtoul(argv[3], NULL, 0), argv[argc-1], now, 0, 0);
         return 1;
     } else if (argv[2][0] == '-') {
         gline_remove(argv[2]+1, 0);
@@ -1519,6 +1590,22 @@ static CMD_FUNC(cmd_gline)
         return 0;
 }
 
+static CMD_FUNC(cmd_shun)
+{
+    if (argc < 3)
+        return 0;
+    if (argv[2][0] == '+') {
+        if (argc < 5)
+            return 0;
+        shun_add(origin, argv[2]+1, strtoul(argv[3], NULL, 0), argv[argc-1], now, 0);
+        return 1;
+    } else if (argv[2][0] == '-') {
+        shun_remove(argv[2]+1, 0);
+        return 1;
+    } else
+        return 0;
+}
+
 static CMD_FUNC(cmd_svsnick)
 {
     struct userNode *target, *dest;
@@ -1574,6 +1661,8 @@ init_parse(void)
     char numer[COMBO_NUMERIC_LEN+1];
 
     /* read config items */
+    str = conf_get_data("server/extended_accounts", RECDB_QSTRING);
+    extended_accounts = str ? enabled_string(str) : 1;
     str = conf_get_data("server/ping_freq", RECDB_QSTRING);
     ping_freq = str ? ParseInterval(str) : 120;
     str = conf_get_data("server/ping_timeout", RECDB_QSTRING);
@@ -1666,6 +1755,8 @@ init_parse(void)
     dict_insert(irc_func_dict, TOK_WHOIS, cmd_whois);
     dict_insert(irc_func_dict, CMD_GLINE, cmd_gline);
     dict_insert(irc_func_dict, TOK_GLINE, cmd_gline);
+    dict_insert(irc_func_dict, CMD_SHUN, cmd_shun);
+    dict_insert(irc_func_dict, TOK_SHUN, cmd_shun);
     dict_insert(irc_func_dict, CMD_OPMODE, cmd_opmode);
     dict_insert(irc_func_dict, TOK_OPMODE, cmd_opmode);
     dict_insert(irc_func_dict, CMD_CLEARMODE, cmd_clearmode);
@@ -1705,6 +1796,8 @@ init_parse(void)
     dict_insert(irc_func_dict, TOK_MARK, cmd_dummy);
     /* Ignore privs */
     dict_insert(irc_func_dict, TOK_PRIVS, cmd_dummy);
+    /* Ignore remote luser */
+    dict_insert(irc_func_dict, TOK_LUSERS, cmd_dummy);
     /* We have reliable clock!  Always!  Wraaa! */
     dict_insert(irc_func_dict, CMD_SETTIME, cmd_dummy);
     dict_insert(irc_func_dict, TOK_SETTIME, cmd_dummy);
@@ -1717,6 +1810,7 @@ init_parse(void)
     /* ban list resetting */
     /* "stats g" responses */
     dict_insert(irc_func_dict, "247", cmd_num_gline);
+    dict_insert(irc_func_dict, "542", cmd_num_shun);
     dict_insert(irc_func_dict, "219", cmd_dummy); /* "End of /STATS report" */
     /* other numeric responses we might get */
     dict_insert(irc_func_dict, "401", cmd_dummy); /* target left network */
@@ -2079,6 +2173,10 @@ AddUser(struct server* uplink, const char *nick, const char *ident, const char *
     for (n=0; n<nuf_used; n++)
         if (nuf_list[n](uNode))
             break;
+
+    if ((uNode->loc == 1) && (uNode->handle_info))
+        send_func_list(uNode);
+
     return uNode;
 }
 
@@ -2134,8 +2232,9 @@ DelUser(struct userNode* user, struct userNode *killer, int announce, const char
         free_user(user);
 }
 
+static void call_oper_funcs(struct userNode *user);
+
 void mod_usermode(struct userNode *user, const char *mode_change) {
-    static void call_oper_funcs(struct userNode *user);
     int add = 1;
     const char *word = mode_change;
 
@@ -2150,13 +2249,15 @@ void mod_usermode(struct userNode *user, const char *mode_change) {
        case '+': add = 1; break;
        case '-': add = 0; break;
        case 'o':
-           do_user_mode(FLAGS_OPER);
            if (add) {
-               userList_append(&curr_opers, user);
-               call_oper_funcs(user);
+                if(!IsOper(user)) { /* Dont re-oper an oper */
+                    userList_append(&curr_opers, user);
+                    call_oper_funcs(user);
+                }
            } else {
                userList_remove(&curr_opers, user);
            }
+           do_user_mode(FLAGS_OPER);
            break;
        case 'O': do_user_mode(FLAGS_LOCOP); break;
        case 'i': do_user_mode(FLAGS_INVISIBLE);