Store RPL_TOPICWHOTIME. Fixes #97
authorJelmer Vernooij <jelmer@samba.org>
Sat, 10 Mar 2007 21:15:53 +0000 (22:15 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Sat, 10 Mar 2007 21:15:53 +0000 (22:15 +0100)
NEWS
src/repl.c
src/settings.c
src/state.c
src/state.h
testsuite/test-state.c

diff --git a/NEWS b/NEWS
index e0d4ab5afeb76a8d880f03f643002b71875047f2..ec648862dc72cebe5512492831793da71cc3197d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,8 @@ Ctrlproxy 3.0.2 UNRELEASED
 
     * Fixed crash when using SSL support. (#83)
 
+       * Add support for storing topic set time and topic set by nick (#97).
+
   FEATURES
 
     * More advanced help support
index 38d79d590823ef8fbded9e9c54a8b97789b68423..586ebafabb5164c44d8ec3e4f81f8d2834639648 100644 (file)
@@ -69,6 +69,11 @@ static void gen_replication_channel(struct client *c, struct channel_state *ch)
        if(ch->topic) {
                client_send_response(c, RPL_TOPIC, ch->name, ch->topic, NULL);
        }
+       if(ch->topic_set_time && ch->topic_set_by) {
+               char tmp[5];
+               snprintf(tmp, sizeof(tmp), "%lu", ch->topic_set_time);
+               client_send_response(c, RPL_TOPICWHOTIME, ch->topic_set_by, tmp, NULL);
+       }
 
        for (nl = ch->nicks; nl; nl = nl->next) {
                char mode[2] = { ch->mode, 0 };
index 6e0a1911e7538030c39b689795e88892aeedb086..8526976057b01f7a6927ebf3f7c0fb6d9ebd10cf 100644 (file)
@@ -301,14 +301,14 @@ static struct network_config *config_load_network(struct ctrlproxy_config *cfg,
                g_free(n->fullname);
                n->fullname = g_key_file_get_string(kf, "global", "fullname", NULL);
                if (!strcmp(n->fullname, "") || n->fullname[0] == ' ')
-                       log_network(LOG_WARNING, n, "Invalid fullname `%s' set", n->fullname);
+                       log_global(LOG_WARNING, "Invalid fullname `%s' set for network `%s'", n->fullname, n->name);
        }
 
        if (g_key_file_has_key(kf, "global", "nick", NULL)) {
                g_free(n->nick);
                n->nick = g_key_file_get_string(kf, "global", "nick", NULL);
                if (!strcmp(n->nick, "") || n->nick[0] == ' ')
-                       log_network(LOG_WARNING, n, "Invalid nick name `%s' set", n->fullname);
+                       log_global(LOG_WARNING, "Invalid nick name `%s' set for `%s'", n->nick, n->name);
        }
 
        if (g_key_file_has_key(kf, "global", "reconnect-interval", NULL)) {
@@ -323,7 +323,7 @@ static struct network_config *config_load_network(struct ctrlproxy_config *cfg,
                g_free(n->username);
                n->username = g_key_file_get_string(kf, "global", "username", NULL);
                if (!strcmp(n->username, "") || n->username[0] == ' ')
-                       log_network(LOG_WARNING, n, "Invalid username `%s' set", n->username);
+                       log_global(LOG_WARNING, "Invalid username `%s' set for network `%s'", n->username, n->name);
        }
 
        if (g_key_file_has_key(kf, "global", "ignore_first_nick", NULL)) {
index 9a37f0ae833b6694f7ec7ce2b9f5c4454e19bafb..67a5a89c9cc6363b8d985a57969e5f54630fa5b2 100644 (file)
@@ -428,6 +428,8 @@ static void handle_topic(struct network_state *s, struct line *l)
        struct channel_state *c = find_channel(s, l->args[1]);
        if(c->topic)g_free(c->topic);
        c->topic = g_strdup(l->args[2]);
+       c->topic_set_time = time(NULL);
+       c->topic_set_by = line_get_nick(l);
 }
 
 static void handle_332(struct network_state *s, struct line *l) 
@@ -443,6 +445,19 @@ static void handle_332(struct network_state *s, struct line *l)
        c->topic = g_strdup(l->args[3]);
 }
 
+static void handle_333(struct network_state *s, struct line *l) 
+{
+       struct channel_state *c = find_channel(s, l->args[1]);
+
+       if(!c) {
+               log_network_state(LOG_WARNING, s, "Can't set topic last set time for unknown channel '%s'!", l->args[1]);
+               return;
+       }
+
+       c->topic_set_time = atoi(l->args[3]);
+       c->topic_set_by = g_strdup(l->args[2]);
+}
+
 static void handle_no_topic(struct network_state *s, struct line *l) 
 {
        struct channel_state *c = find_channel(s, l->args[1]);
@@ -832,6 +847,7 @@ static struct irc_command {
        { "324", 3, handle_324 },
        { "329", 3, handle_329 },
        { "332", 3, handle_332 },
+       { "333", 3, handle_333 },
        { "331", 1, handle_no_topic },
        { "353", 4, handle_namreply },
        { "366", 2, handle_end_names },
index dee6684377b2786dbac3d08d5da6d7f80abb306b..0cf157e49cd66c97a4c0dee41654762d0ce1429e 100644 (file)
@@ -78,6 +78,8 @@ struct channel_state {
        char *name;
        char *key;
        char *topic;
+       time_t topic_set_time;
+       char *topic_set_by; /* nickname */
        char mode; /* Private, secret, etc */
        char modes[255];
        time_t creation_time;
index ab8ae699c26477497b3f908eba716bf71348e383..4d8f565e36d526cb896f409534bfa5995793a430 100644 (file)
@@ -86,11 +86,13 @@ START_TEST(state_topic)
        fail_if (!ns);
 
        state_process(ns, ":bla!user@host JOIN #examplechannel");
-       state_process(ns, "TOPIC #examplechannel :This is the topic");
+       state_process(ns, ":bla!user@host TOPIC #examplechannel :This is the topic");
 
        cs = ns->channels->data;
 
        fail_unless (strcmp(cs->topic, "This is the topic") == 0);
+       fail_unless (abs(cs->topic_set_time - time(NULL)) < 5);
+       fail_unless (strcmp(cs->topic_set_by, "bla") == 0);
 END_TEST