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)
-- 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`)
-- 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
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)
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();
{"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}
};
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)
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();
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);
CMD_BIND(neonserv_cmd_voiceall);
CMD_BIND(neonserv_cmd_wipeinfo);
+CMD_BIND(neonserv_cmd_debug);
+
#endif
\ No newline at end of file
--- /dev/null
+/* 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);
+ }
+ }
+}
//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 {
--- /dev/null
+/* 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);
+
+}
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 {
*/
#include "mysqlConn.h"
-#define DATABASE_VERSION "2"
+#define DATABASE_VERSION "3"
struct used_result {
MYSQL_RES *result;