added cmd_info & cmd_debug
authorpk910 <philipp@zoelle1.de>
Tue, 4 Oct 2011 15:31:06 +0000 (17:31 +0200)
committerpk910 <philipp@zoelle1.de>
Tue, 4 Oct 2011 15:45:19 +0000 (17:45 +0200)
12 files changed:
Makefile.am
database.sql
database.upgrade.sql
src/ChanNode.c
src/ChanNode.h
src/bot_NeonServ.c
src/cmd_neonserv.h
src/cmd_neonserv_debug.c [new file with mode: 0644]
src/cmd_neonserv_giveowner.c
src/cmd_neonserv_info.c [new file with mode: 0644]
src/cmd_neonserv_users.c
src/mysqlConn.c

index 5f8df90ff3541f9c100033ec8aa31d6ade215080..759d0994c96d8dbb0309a9199b89a292d564ef65 100644 (file)
@@ -102,6 +102,8 @@ neonserv_SOURCES = src/version.c \
       src/cmd_neonserv_delrank.c \
       src/cmd_neonserv_listrank.c \
       src/cmd_neonserv_setrank.c \
+      src/cmd_neonserv_info.c \
+      src/cmd_neonserv_debug.c \
       src/lib/ini.c
 
 neonserv_LDADD = $(MYSQL_LIBS) $(WINSOCK_LIBS)
index 01f3a1f8c0db5c9a5eb3ef9155f0654305036963..4c82678b76dce04eb48a2be3be1dfeee6ca5685b 100644 (file)
@@ -269,10 +269,12 @@ CREATE TABLE IF NOT EXISTS `noinvite` (
 -- Tabellenstruktur für Tabelle `owner_history`
 --
 
+
 CREATE TABLE IF NOT EXISTS `owner_history` (
   `owner_history_id` int(11) NOT NULL AUTO_INCREMENT,
   `owner_history_cid` int(11) NOT NULL,
-  `owner_history_uid` int(11) NOT NULL,
+  `owner_history_to_uid` int(11) NOT NULL,
+  `owner_history_from_uid` int(11) NOT NULL,
   `owner_history_time` int(11) NOT NULL,
   PRIMARY KEY (`owner_history_id`),
   KEY `owner_history_cid` (`owner_history_cid`)
index 4d1dd2bc26108532b229f8c894c843cdefc79323..f44c5eed6e8bf7534eff384798aba6ada552411e 100644 (file)
@@ -14,3 +14,7 @@ ALTER TABLE `users` ADD `user_rank` INT( 11 ) NOT NULL AFTER `user_access`;
 
 -- version: 2
 
+ALTER TABLE `owner_history` CHANGE `owner_history_uid` `owner_history_to_uid` INT( 11 ) NOT NULL;
+ALTER TABLE `owner_history` ADD `owner_history_from_uid` INT( 11 ) NOT NULL AFTER `owner_history_to_uid`;
+
+-- version: 3
index 011b997550deb86c16aa0c58e4d149cd6cbdf54b..affe863cc1034cc3bdf914ec15fdf0e59cde239a 100644 (file)
@@ -92,6 +92,21 @@ static int get_chanlist_entry(int name) {
     return 46;
 }
 
+struct ChanNode* getAllChans(struct ChanNode *last) {
+    if(last == NULL || last->next == NULL) {
+        int cindex;
+        if(last == NULL)
+            cindex = 0;
+        else
+            cindex = get_chanlist_entry(last->name[1]) + 1;
+        while(chanList[cindex] == NULL && cindex < CHANNEL_LIST_SIZE)
+            cindex++;
+        if(cindex >= CHANNEL_LIST_SIZE) return NULL;
+        return chanList[cindex];
+    } else
+        return last->next;
+}
+
 struct ChanNode* getChanByName(const char *name) { //case insensitive
     int chanListIndex = get_chanlist_entry(name[1]);
     if(chanListIndex == -1 || chanList[chanListIndex] == NULL)
index 002405b85ed93168a73e42743feb1552efd3ffd5..1ada6626b95bba131a608e3c2f3a6d55ebc3f5d5 100644 (file)
@@ -46,6 +46,7 @@ struct ChanNode {
 void init_ChanNode();
 void free_ChanNode();
 int is_valid_chan(const char *name);
+struct ChanNode* getAllChans(struct ChanNode *last);
 struct ChanNode* getChanByName(const char *name);
 struct ChanNode* addChannel(const char *chan);
 int getChannelCount();
index 5c0a68bbf0f3134adadc0f19fe00a1847758b01f..05a4d5cdb48633679bd20642dcea9c9de5667657 100644 (file)
@@ -295,6 +295,18 @@ static const struct default_language_entry msgtab[] = {
     {"NS_SETRANK_UNKNOWN_SETTING", "$b%s$b is an unknown support rank setting."},  /* {ARGS: "moep"} */
     {"NS_SETRANK_ORDER_INVALID", "%d is an invalid numeric value. (valid: 1-99)"},  /* {ARGS: 100} */
     {"NS_ASSIGNRANK_DONE", "$b%s$b is now ranked as '$b%s$b'."},  /* {ARGS: "TestUser", "Supporter"} */
+    {"NS_INFO_HEADER", "$b%s$b Information:"},
+    {"NS_INFO_DEFAULTTOPIC", "$bDefault Topic:$b"},
+    {"NS_INFO_MODELOCK", "$bMode Lock:$b"},
+    {"NS_INFO_RECORD", "$bRecord Visitors:$b"},
+    {"NS_INFO_OWNER", "$bOwner:$b"},
+    {"NS_INFO_USERS", "$bTotal User Count:$b"},
+    {"NS_INFO_BANS", "$bBan Count:$b"},
+    {"NS_INFO_VISITED", "$bVisited:$b"},
+    {"NS_INFO_REGISTERED", "$bRegistered:$b"},
+    {"NS_INFO_REGISTRAR", "$bRegistered by:$b"},
+    {"NS_INFO_OWNERLOG", "Ownership transfer history for $b%s$b:"},
+    {"NS_INFO_OWNERCHANGE", " from %s to %s on %s (%s)"},
     {NULL, NULL}
 };
 
@@ -489,6 +501,7 @@ void init_NeonServ() {
     USER_COMMAND("help",         neonserv_cmd_help,      0, NULL,                   0);
     USER_COMMAND("events",       neonserv_cmd_events,    0, "1",                    CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH);
     USER_COMMAND("command",      neonserv_cmd_command,   1, NULL,                   0);
+    USER_COMMAND("info",         neonserv_cmd_info,      0, NULL,                   CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN);
     #undef USER_COMMAND
     
     #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(BOTID, NAME, FUNCTION, PARAMCOUNT, NULL, GACCESS, FLAGS)
@@ -516,6 +529,7 @@ void init_NeonServ() {
     OPER_COMMAND("setrank",      neonserv_cmd_setrank,   1,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
     OPER_COMMAND("assignrank",   neonserv_cmd_assignrank,2,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
     OPER_COMMAND("listrank",     neonserv_cmd_listrank,  0,     1,    CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
+    OPER_COMMAND("debug",        neonserv_cmd_debug,     0,     1,    CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
     #undef OPER_COMMAND
     
     start_bots();
index f008e407f836ce517e32ca3469aca67282d3f9cd..b1239610a2e5dee71ea4f8d0fc27639b9367bb6f 100644 (file)
@@ -66,6 +66,7 @@ CMD_BIND(neonserv_cmd_events);
 CMD_BIND(neonserv_cmd_giveowner);
 CMD_BIND(neonserv_cmd_god);
 CMD_BIND(neonserv_cmd_help);
+CMD_BIND(neonserv_cmd_info);
 CMD_BIND(neonserv_cmd_invite);
 CMD_BIND(neonserv_cmd_inviteme);
 CMD_BIND(neonserv_cmd_kick);
@@ -110,4 +111,6 @@ CMD_BIND(neonserv_cmd_voice);
 CMD_BIND(neonserv_cmd_voiceall);
 CMD_BIND(neonserv_cmd_wipeinfo);
 
+CMD_BIND(neonserv_cmd_debug);
+
 #endif
\ No newline at end of file
diff --git a/src/cmd_neonserv_debug.c b/src/cmd_neonserv_debug.c
new file mode 100644 (file)
index 0000000..6791b1a
--- /dev/null
@@ -0,0 +1,59 @@
+/* cmd_neonserv_debug.c - NeonServ v5.0
+ * Copyright (C) 2011  Philipp Kreil (pk910)
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License 
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. 
+ */
+
+#include "cmd_neonserv.h"
+
+CMD_BIND(neonserv_cmd_debug) {
+    //heavy debug
+    reply(getTextBot(), user, "HEAVY DEBUG!");
+    struct ChanNode *dbg_chan;
+    struct ChanUser *dbg_chanuser, *dbg_chanuser2;
+    struct UserNode *dbg_user;
+    char *dbg_string;
+    reply(getTextBot(), user, "CHANNEL TRACE:");
+    for(dbg_chan = getAllChans(NULL); dbg_chan; dbg_chan = getAllChans(dbg_chan)) {
+        reply(getTextBot(), user, "  \0037%s\003 [0x%08x]  (ChanUsers: %d)", dbg_chan->name, dbg_chan, dbg_chan->usercount);
+        for(dbg_chanuser = dbg_chan->user; dbg_chanuser; dbg_chanuser = dbg_chanuser->next_user) {
+            reply(getTextBot(), user, "    \0032%s@%s\003 [0x%08x]   [UserNode: %08x] [ChanNode: %08x]", dbg_chanuser->user->nick, dbg_chanuser->chan->name, dbg_chanuser, dbg_chanuser->user, dbg_chanuser->chan);
+            dbg_user = dbg_chanuser->user;
+            dbg_string = "\0034fail\003";
+            for(dbg_chanuser2 = dbg_user->channel; dbg_chanuser2; dbg_chanuser2 = dbg_chanuser2->next_chan) {
+                if(dbg_chanuser2->chan == dbg_chan) {
+                    dbg_string = "\0033OK\003";
+                    break;
+                }
+            }
+            reply(getTextBot(), user, "      check for user->channel entry: %s", dbg_string);
+        }
+    }
+    reply(getTextBot(), user, "USER TRACE:");
+    for(dbg_user = getAllUsers(NULL); dbg_user; dbg_user = getAllUsers(dbg_user)) {
+        reply(getTextBot(), user, "  \0037%s\003 [0x%08x]  (Host: %s@%s  Auth: %s)", dbg_user->nick, dbg_user, dbg_user->ident, dbg_user->host, ((dbg_user->flags & USERFLAG_ISAUTHED) ? dbg_user->auth : "*"));
+        for(dbg_chanuser = dbg_user->channel; dbg_chanuser; dbg_chanuser = dbg_chanuser->next_chan) {
+            reply(getTextBot(), user, "    \0032%s@%s\003 [0x%08x]   [UserNode: %08x] [ChanNode: %08x]", dbg_chanuser->user->nick, dbg_chanuser->chan->name, dbg_chanuser, dbg_chanuser->user, dbg_chanuser->chan);
+            dbg_chan = dbg_chanuser->chan;
+            dbg_string = "\0034fail\003";
+            for(dbg_chanuser2 = dbg_chan->user; dbg_chanuser2; dbg_chanuser2 = dbg_chanuser2->next_user) {
+                if(dbg_chanuser2->user == dbg_user) {
+                    dbg_string = "\0033OK\003";
+                    break;
+                }
+            }
+            reply(getTextBot(), user, "      check for channel->user entry: %s", dbg_string);
+        }
+    }
+}
index b16a890d00f371f0fcb9fe446e123906caabd0a4..4f34e840216c036da286159ddb66d1e9aa80ee61 100644 (file)
@@ -124,7 +124,7 @@ static void neonserv_cmd_giveowner_async1(struct ClientSocket *client, struct Cl
                 //give ownership
                 printf_mysql_query("UPDATE `chanusers` SET `chanuser_access` = '500' WHERE `chanuser_id` = '%s'", row[1]);
                 printf_mysql_query("UPDATE `chanusers` SET `chanuser_access` = '499' WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = (SELECT `user_id` FROM `users` WHERE `user_user` = '%s')", chan->channel_id, escape_string(user->auth));
-                printf_mysql_query("INSERT INTO `owner_history` (`owner_history_cid`, `owner_history_uid`, `owner_history_time`) VALUE ('%d', '%d', UNIX_TIMESTAMP())", chan->channel_id, userid);
+                printf_mysql_query("INSERT INTO `owner_history` (`owner_history_cid`, `owner_history_from_uid`, `owner_history_to_uid`, `owner_history_time`) VALUE ('%d', (SELECT `user_id` FROM `users` WHERE `user_user` = '%s'), '%d', UNIX_TIMESTAMP())", chan->channel_id, escape_string(user->auth), userid);
                 reply(textclient, user, "NS_GIVEOWNER_DONE", chan->name, auth);
                 logEvent(event);
             } else {
diff --git a/src/cmd_neonserv_info.c b/src/cmd_neonserv_info.c
new file mode 100644 (file)
index 0000000..293373e
--- /dev/null
@@ -0,0 +1,85 @@
+/* cmd_neonserv_info.c - NeonServ v5.0
+ * Copyright (C) 2011  Philipp Kreil (pk910)
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License 
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. 
+ */
+
+#include "cmd_neonserv.h"
+
+/*
+* no parameters
+*/
+
+CMD_BIND(neonserv_cmd_info) {
+    MYSQL_RES *res;
+    MYSQL_ROW row, row2;
+    struct Table *table;
+    printf_mysql_query("SELECT `channel_defaulttopic`, `channel_modes`, `channel_maxusers`, `channel_lastvisit`, `channel_registered`, `user_user` FROM `channels` LEFT JOIN `users` ON `channel_registrator` = `user_id` WHERE `channel_id` = '%d'", chan->channel_id);
+    res = mysql_use();
+    row = mysql_fetch_row(res);
+    table = table_init(2, 9, 0);
+    char *content[2];
+    reply(getTextBot(), user, "NS_INFO_HEADER", chan->name);
+    content[0] = get_language_string(user, "NS_INFO_DEFAULTTOPIC");
+    content[1] = row[0];
+    table_add(table, content);
+    content[0] = get_language_string(user, "NS_INFO_MODELOCK");
+    content[1] = row[1];
+    table_add(table, content);
+    content[0] = get_language_string(user, "NS_INFO_RECORD");
+    content[1] = row[2];
+    table_add(table, content);
+    printf_mysql_query("SELECT `user_user`, `chanuser_access` FROM `chanusers` LEFT JOIN `users` ON `user_id` = `chanuser_uid` WHERE `chanuser_cid` = '%d'", chan->channel_id);
+    res = mysql_use();
+    char ownerstr[MAXLEN];
+    int ownerpos = 0, usercount = 0;
+    while((row2 = mysql_fetch_row(res))) {
+        if(!strcmp(row2[1], "500"))
+            ownerpos += sprintf(ownerstr + ownerpos, (ownerpos ? ", %s" : "%s"), row2[0]);
+        usercount++;
+    }
+    content[0] = get_language_string(user, "NS_INFO_OWNER");
+    content[1] = ownerstr;
+    table_add(table, content);
+    sprintf(ownerstr, "%d", usercount);
+    content[0] = get_language_string(user, "NS_INFO_USERS");
+    content[1] = ownerstr;
+    table_add(table, content);
+    printf_mysql_query("SELECT COUNT(*) FROM `bans` WHERE `ban_channel` = '%d'", chan->channel_id);
+    res = mysql_use();
+    row2 = mysql_fetch_row(res);
+    content[0] = get_language_string(user, "NS_INFO_BANS");
+    content[1] = row2[0];
+    table_add(table, content);
+    content[0] = get_language_string(user, "NS_INFO_VISITED");
+    content[1] = timeToStr(user, time(0) - atoi(row[3]), 2, ownerstr);
+    table_add(table, content);
+    if(strcmp(row[4], "0")) {
+        content[0] = get_language_string(user, "NS_INFO_REGISTERED");
+        content[1] = timeToStr(user, time(0) - atoi(row[4]), 2, ownerstr);
+        table_add(table, content);
+    }
+    if(row[5]) {
+        content[0] = get_language_string(user, "NS_INFO_REGISTRAR");
+        content[1] = row[5];
+        table_add(table, content);
+    }
+    char **table_lines = table_end(table);
+    int i;
+    for(i = 0; i < table->entrys; i++) {
+        reply(getTextBot(), user, table_lines[i]);
+    }
+    table_free(table);
+    
+}
index 4501f43e10bd8b07be162cd624078b3755b96489..73972211a9d84e769d3c61164de5674b632c5b2a 100644 (file)
@@ -91,7 +91,7 @@ static void neonserv_cmd_users_async1(struct ClientSocket *client, struct Client
             content[1] = row[1];
             is_here = 0;
             for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
-                if((chanuser->user->flags & USERFLAG_ISAUTHED) && !strcmp(chanuser->user->auth, row[1])) {
+                if((chanuser->user->flags & USERFLAG_ISAUTHED) && !stricmp(chanuser->user->auth, row[1])) {
                     if((chanuser->flags & CHANUSERFLAG_INVISIBLE))
                         is_here = 2;
                     else {
index 12917f290b42f78625b2825cfa715f9ce09a386f..c2941f710ffb32fd9cfe9e721d81751723787e20 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 #include "mysqlConn.h"
-#define DATABASE_VERSION "2"
+#define DATABASE_VERSION "3"
 
 struct used_result {
     MYSQL_RES *result;