From: pk910 Date: Tue, 4 Oct 2011 15:31:06 +0000 (+0200) Subject: added cmd_info & cmd_debug X-Git-Tag: v5.3~326 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=053cd1002b31ad83d505dabce9f37b2a737fcabd added cmd_info & cmd_debug --- diff --git a/Makefile.am b/Makefile.am index 5f8df90..759d099 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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) diff --git a/database.sql b/database.sql index 01f3a1f..4c82678 100644 --- a/database.sql +++ b/database.sql @@ -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`) diff --git a/database.upgrade.sql b/database.upgrade.sql index 4d1dd2b..f44c5ee 100644 --- a/database.upgrade.sql +++ b/database.upgrade.sql @@ -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 diff --git a/src/ChanNode.c b/src/ChanNode.c index 011b997..affe863 100644 --- a/src/ChanNode.c +++ b/src/ChanNode.c @@ -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) diff --git a/src/ChanNode.h b/src/ChanNode.h index 002405b..1ada662 100644 --- a/src/ChanNode.h +++ b/src/ChanNode.h @@ -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(); diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index 5c0a68b..05a4d5c 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -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(); diff --git a/src/cmd_neonserv.h b/src/cmd_neonserv.h index f008e40..b123961 100644 --- a/src/cmd_neonserv.h +++ b/src/cmd_neonserv.h @@ -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 index 0000000..6791b1a --- /dev/null +++ b/src/cmd_neonserv_debug.c @@ -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 . + */ + +#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); + } + } +} diff --git a/src/cmd_neonserv_giveowner.c b/src/cmd_neonserv_giveowner.c index b16a890..4f34e84 100644 --- a/src/cmd_neonserv_giveowner.c +++ b/src/cmd_neonserv_giveowner.c @@ -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 index 0000000..293373e --- /dev/null +++ b/src/cmd_neonserv_info.c @@ -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 . + */ + +#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); + +} diff --git a/src/cmd_neonserv_users.c b/src/cmd_neonserv_users.c index 4501f43..7397221 100644 --- a/src/cmd_neonserv_users.c +++ b/src/cmd_neonserv_users.c @@ -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 { diff --git a/src/mysqlConn.c b/src/mysqlConn.c index 12917f2..c2941f7 100644 --- a/src/mysqlConn.c +++ b/src/mysqlConn.c @@ -16,7 +16,7 @@ */ #include "mysqlConn.h" -#define DATABASE_VERSION "2" +#define DATABASE_VERSION "3" struct used_result { MYSQL_RES *result;