From: pk910 Date: Mon, 31 Oct 2011 16:18:05 +0000 (+0100) Subject: simplified modcmd system X-Git-Tag: v5.3~233 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=ffc462dec2b405f14d7b13d37e17b95ea6fdf2f5 simplified modcmd system --- diff --git a/Makefile.am b/Makefile.am index 8c32f66..215c28b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -29,6 +29,7 @@ neonserv_SOURCES = src/version.c \ src/timeq.c \ src/DBHelper.c \ src/IRCQueue.c \ + src/commands.c \ src/bots.c \ src/bot_NeonServ.c \ src/bot_NeonSpam.c \ @@ -39,7 +40,7 @@ neonserv_SOURCES = src/version.c \ src/cmd_neonserv_adduser.c \ src/cmd_neonserv_ban.c \ src/cmd_neonserv_bans.c \ - src/cmd_neonserv_bind.c \ + src/cmd_global_bind.c \ src/cmd_neonserv_chanservsync.c \ src/cmd_neonserv_clvl.c \ src/cmd_neonserv_command.c \ @@ -54,10 +55,10 @@ neonserv_SOURCES = src/version.c \ src/cmd_neonserv_devoiceall.c \ src/cmd_neonserv_down.c \ src/cmd_neonserv_downall.c \ - src/cmd_neonserv_emote.c \ + src/cmd_global_emote.c \ src/cmd_neonserv_events.c \ src/cmd_neonserv_giveowner.c \ - src/cmd_neonserv_god.c \ + src/cmd_global_god.c \ src/cmd_neonserv_help.c \ src/cmd_neonserv_invite.c \ src/cmd_neonserv_inviteme.c \ @@ -67,21 +68,21 @@ neonserv_SOURCES = src/version.c \ src/cmd_neonserv_mode.c \ src/cmd_neonserv_move.c \ src/cmd_neonserv_myaccess.c \ - src/cmd_neonserv_netinfo.c \ - src/cmd_neonserv_notice.c \ + src/cmd_global_netinfo.c \ + src/cmd_global_notice.c \ src/cmd_neonserv_op.c \ src/cmd_neonserv_opall.c \ src/cmd_neonserv_oplog.c \ src/cmd_neonserv_peek.c \ - src/cmd_neonserv_raw.c \ + src/cmd_global_raw.c \ src/cmd_neonserv_recover.c \ - src/cmd_neonserv_register.c \ - src/cmd_neonserv_reloadlang.c \ + src/cmd_global_register.c \ + src/cmd_global_reloadlang.c \ src/cmd_neonserv_resync.c \ - src/cmd_neonserv_say.c \ + src/cmd_global_say.c \ src/cmd_neonserv_search.c \ src/cmd_neonserv_set.c \ - src/cmd_neonserv_setaccess.c \ + src/cmd_global_setaccess.c \ src/cmd_neonserv_suspend.c \ src/cmd_neonserv_topic.c \ src/cmd_neonserv_trace.c \ @@ -89,14 +90,14 @@ neonserv_SOURCES = src/version.c \ src/cmd_neonserv_unban.c \ src/cmd_neonserv_unbanall.c \ src/cmd_neonserv_unbanme.c \ - src/cmd_neonserv_unbind.c \ - src/cmd_neonserv_unregister.c \ + src/cmd_global_unbind.c \ + src/cmd_global_unregister.c \ src/cmd_neonserv_unsuspend.c \ src/cmd_neonserv_up.c \ src/cmd_neonserv_upall.c \ src/cmd_neonserv_users.c \ src/cmd_neonserv_uset.c \ - src/cmd_neonserv_version.c \ + src/cmd_global_version.c \ src/cmd_neonserv_voice.c \ src/cmd_neonserv_voiceall.c \ src/cmd_neonserv_wipeinfo.c \ diff --git a/src/bot_DummyServ.c b/src/bot_DummyServ.c index 9e77935..3ebe267 100644 --- a/src/bot_DummyServ.c +++ b/src/bot_DummyServ.c @@ -105,25 +105,6 @@ static void start_bots() { void init_DummyServ() { - #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,PRIVS,FLAGS) register_command(BOTID, NAME, FUNCTION, PARAMCOUNT, PRIVS, 0, FLAGS) - // NAME FUNCTION PARAMS PRIVS FLAGS - USER_COMMAND("netinfo", neonserv_cmd_netinfo, 0, NULL, 0); - USER_COMMAND("version", neonserv_cmd_version, 0, NULL, 0); - #undef USER_COMMAND - - #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(BOTID, NAME, FUNCTION, PARAMCOUNT, NULL, GACCESS, FLAGS) - // NAME FUNCTION PARAMS ACCS FLAGS - OPER_COMMAND("register", neonserv_cmd_register, 1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("unregister", neonserv_cmd_unregister,1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("bind", neonserv_cmd_bind, 2, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); - OPER_COMMAND("unbind", neonserv_cmd_unbind, 1, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); - OPER_COMMAND("say", neonserv_cmd_say, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("emote", neonserv_cmd_emote, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("notice", neonserv_cmd_notice, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("raw", neonserv_cmd_raw, 1, 800, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("god", neonserv_cmd_god, 0, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - #undef OPER_COMMAND - start_bots(); //register events diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index 97f4f24..55445e0 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -420,90 +420,6 @@ static void start_bots() { void init_NeonServ() { - #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,PRIVS,FLAGS) register_command(BOTID, NAME, FUNCTION, PARAMCOUNT, PRIVS, 0, FLAGS) - // NAME FUNCTION PARAMS PRIVS FLAGS - USER_COMMAND("adduser", neonserv_cmd_adduser, 2, "#channel_canadd", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("deluser", neonserv_cmd_deluser, 1, "#channel_candel", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("clvl", neonserv_cmd_clvl, 2, "#channel_canclvl", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("access", neonserv_cmd_access, 0, NULL, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_LOG); - USER_COMMAND("users", neonserv_cmd_users, 0, NULL, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN); - USER_COMMAND("suspend", neonserv_cmd_suspend, 1, "#channel_cansuspend", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("unsuspend", neonserv_cmd_unsuspend, 1, "#channel_cansuspend", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("delme", neonserv_cmd_delme, 0, "1", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("myaccess", neonserv_cmd_myaccess, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - USER_COMMAND("up", neonserv_cmd_up, 0, "#channel_getop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("down", neonserv_cmd_down, 0, NULL, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_LOG); - USER_COMMAND("upall", neonserv_cmd_upall, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("downall", neonserv_cmd_downall, 0, NULL, CMDFLAG_LOG); - USER_COMMAND("mdeluser", neonserv_cmd_mdeluser, 2, "#channel_candel", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("trim", neonserv_cmd_trim, 2, NULL, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("giveowner", neonserv_cmd_giveowner, 1, "500", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("op", neonserv_cmd_op, 1, "#channel_canop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("deop", neonserv_cmd_deop, 1, "#channel_canop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("voice", neonserv_cmd_voice, 1, "#channel_canvoice", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("devoice", neonserv_cmd_devoice, 1, "#channel_canvoice", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("opall", neonserv_cmd_opall, 0, "#channel_canop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("deopall", neonserv_cmd_deopall, 0, "#channel_canop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("voiceall", neonserv_cmd_voiceall, 0, "#channel_canvoice", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("devoiceall", neonserv_cmd_devoiceall,0, "#channel_canvoice", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("set", neonserv_cmd_set, 0, "#channel_setters", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("kick", neonserv_cmd_kick, 1, "#channel_cankick", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("kickban", neonserv_cmd_kickban, 1, "#channel_cankick,#channel_canban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("ban", neonserv_cmd_ban, 1, "#channel_canban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("wipeinfo", neonserv_cmd_wipeinfo, 1, "#channel_wipeinfo", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("addban", neonserv_cmd_addban, 1, "#channel_staticban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("bans", neonserv_cmd_bans, 0, "1", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - USER_COMMAND("delban", neonserv_cmd_delban, 1, "#channel_staticban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("netinfo", neonserv_cmd_netinfo, 0, NULL, 0); - USER_COMMAND("topic", neonserv_cmd_topic, 0, "#channel_changetopic", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("chanservsync", neonserv_cmd_chanservsync, 0,"500", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("resync", neonserv_cmd_resync, 0, "#channel_canresync", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("addtimeban", neonserv_cmd_addtimeban,2, "#channel_staticban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("mode", neonserv_cmd_mode, 1, "#channel_getop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("version", neonserv_cmd_version, 0, NULL, 0); - USER_COMMAND("peek", neonserv_cmd_peek, 0, NULL, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN); - USER_COMMAND("uset", neonserv_cmd_uset, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - USER_COMMAND("unban", neonserv_cmd_unban, 1, "#channel_canban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("unbanall", neonserv_cmd_unbanall, 0, "#channel_canban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("unbanme", neonserv_cmd_unbanme, 0, "#channel_canban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("invite", neonserv_cmd_invite, 1, "#channel_canop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - USER_COMMAND("inviteme", neonserv_cmd_inviteme, 0, "#channel_getinvite", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - 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); - USER_COMMAND("extscript", neonserv_cmd_extscript, 0, NULL, CMDFLAG_EMPTY_ARGS | CMDFLAG_CHAN_PARAM); - #undef USER_COMMAND - - #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(BOTID, NAME, FUNCTION, PARAMCOUNT, NULL, GACCESS, FLAGS) - // NAME FUNCTION PARAMS ACCS FLAGS - OPER_COMMAND("trace", neonserv_cmd_trace, 1, 400, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - OPER_COMMAND("register", neonserv_cmd_register, 1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("unregister", neonserv_cmd_unregister,1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("recover", neonserv_cmd_recover, 1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("say", neonserv_cmd_say, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("emote", neonserv_cmd_emote, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("notice", neonserv_cmd_notice, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("raw", neonserv_cmd_raw, 1, 800, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("god", neonserv_cmd_god, 0, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("reloadlang", neonserv_cmd_reloadlang,1, 500, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("csuspend", neonserv_cmd_csuspend, 1, 100, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("cunsuspend", neonserv_cmd_cunsuspend,1, 100, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("move", neonserv_cmd_move, 2, 300, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("bind", neonserv_cmd_bind, 2, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); - OPER_COMMAND("unbind", neonserv_cmd_unbind, 1, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); - OPER_COMMAND("oplog", neonserv_cmd_oplog, 0, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("search", neonserv_cmd_search, 1, 400, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - OPER_COMMAND("setaccess", neonserv_cmd_setaccess, 2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("addrank", neonserv_cmd_addrank, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("delrank", neonserv_cmd_delrank, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - 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("rename", neonserv_cmd_rename, 2, 300, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("unvisited", neonserv_cmd_unvisited, 0, 400, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - #undef OPER_COMMAND - start_bots(); //register events diff --git a/src/bot_NeonSpam.c b/src/bot_NeonSpam.c index 57d9164..f1fe00c 100644 --- a/src/bot_NeonSpam.c +++ b/src/bot_NeonSpam.c @@ -291,28 +291,6 @@ static void createSpamNode(struct ChanUser *chanuser) { void init_NeonSpam() { - #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,PRIVS,FLAGS) register_command(BOTID, NAME, FUNCTION, PARAMCOUNT, PRIVS, 0, FLAGS) - // NAME FUNCTION PARAMS PRIVS FLAGS - USER_COMMAND("netinfo", neonserv_cmd_netinfo, 0, NULL, 0); - USER_COMMAND("version", neonserv_cmd_version, 0, NULL, 0); - USER_COMMAND("set", neonspam_cmd_set, 0, "#channel_setters", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); - #undef USER_COMMAND - - #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(BOTID, NAME, FUNCTION, PARAMCOUNT, NULL, GACCESS, FLAGS) - // NAME FUNCTION PARAMS ACCS FLAGS - OPER_COMMAND("register", neonserv_cmd_register, 1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("unregister", neonserv_cmd_unregister,1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("bind", neonserv_cmd_bind, 2, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); - OPER_COMMAND("unbind", neonserv_cmd_unbind, 1, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); - OPER_COMMAND("csuspend", neonserv_cmd_csuspend, 1, 100, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("cunsuspend", neonserv_cmd_cunsuspend,1, 100, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("say", neonserv_cmd_say, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("emote", neonserv_cmd_emote, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("notice", neonserv_cmd_notice, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); - OPER_COMMAND("raw", neonserv_cmd_raw, 1, 800, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("god", neonserv_cmd_god, 0, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - #undef OPER_COMMAND - start_bots(); //register events diff --git a/src/cmd_global.h b/src/cmd_global.h new file mode 100644 index 0000000..95164e2 --- /dev/null +++ b/src/cmd_global.h @@ -0,0 +1,54 @@ +/* cmd_global.h - NeonServ v5.2 + * 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 . + */ +#ifndef _cmd_global_h +#define _cmd_global_h +#include "main.h" +#include "modcmd.h" +#include "IRCParser.h" +#include "IRCEvents.h" +#include "UserNode.h" +#include "ChanNode.h" +#include "ChanUser.h" +#include "ModeNode.h" +#include "BanNode.h" +#include "ClientSocket.h" +#include "mysqlConn.h" +#include "lang.h" +#include "HandleInfoHandler.h" +#include "WHOHandler.h" +#include "DBHelper.h" +#include "tools.h" +#include "timeq.h" +#include "version.h" +#include "EventLogger.h" +#include "bots.h" + +CMD_BIND(global_cmd_bind); +CMD_BIND(global_cmd_emote); +CMD_BIND(global_cmd_god); +CMD_BIND(global_cmd_netinfo); +CMD_BIND(global_cmd_notice); +CMD_BIND(global_cmd_raw); +CMD_BIND(global_cmd_register); +CMD_BIND(global_cmd_reloadlang); +CMD_BIND(global_cmd_say); +CMD_BIND(global_cmd_setaccess); +CMD_BIND(global_cmd_unbind); +CMD_BIND(global_cmd_unregister); +CMD_BIND(global_cmd_version); + +#endif \ No newline at end of file diff --git a/src/cmd_global_bind.c b/src/cmd_global_bind.c new file mode 100644 index 0000000..9b65436 --- /dev/null +++ b/src/cmd_global_bind.c @@ -0,0 +1,51 @@ +/* cmd_global_bind.c - NeonServ v5.2 + * 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_global.h" + +/* +* argv[0] command name +* argv[1] command function +* argv[2-*] parameters (optional) +*/ + +CMD_BIND(global_cmd_bind) { + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `function` FROM `bot_binds` WHERE `botclass` = '%d' AND `command` = '%s'", client->botid, escape_string(argv[0])); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + reply(getTextBot(), user, "NS_BIND_ALREADY", argv[0], row[0]); + return; + } + char *params; + if(argc > 2) + params = merge_argv(argv, 2, argc); + else + params = ""; + struct cmd_function *function = find_cmd_function(client->botid, argv[1]); + if(!function) { + reply(getTextBot(), user, "NS_BIND_UNKNOWN", argv[1]); + return; + } + bind_cmd_to_function(client->botid, argv[0], function); + printf_mysql_query("INSERT INTO `bot_binds` (`botclass`, `command`, `function`, `parameters`) VALUES ('%d', '%s', '%s', '%s')", client->botid, escape_string(argv[0]), escape_string(function->name), params); + if(*params) + bind_set_parameters(client->botid, argv[0], params); + reply(getTextBot(), user, "NS_BIND_DONE", argv[0], function->name); + logEvent(event); +} diff --git a/src/cmd_global_emote.c b/src/cmd_global_emote.c new file mode 100644 index 0000000..824f712 --- /dev/null +++ b/src/cmd_global_emote.c @@ -0,0 +1,28 @@ +/* cmd_global_emote.c - NeonServ v5.2 + * 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_global.h" + +/* +* argv[0] target +* argv[1-*] message +*/ + +CMD_BIND(global_cmd_emote) { + char *message = merge_argv(argv, 1, argc); + putsock(client, "PRIVMSG %s :\001ACTION %s\001", argv[0], message); +} \ No newline at end of file diff --git a/src/cmd_global_god.c b/src/cmd_global_god.c new file mode 100644 index 0000000..db063f3 --- /dev/null +++ b/src/cmd_global_god.c @@ -0,0 +1,53 @@ +/* cmd_global_god.c - NeonServ v5.2 + * 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_global.h" + +/* +* argv[0] (optional) on/off +*/ + +CMD_BIND(global_cmd_god) { + if(argc > 0) { + if(!strcmp(argv[0], "0") || !stricmp(argv[0], "off") || !stricmp(argv[0], get_language_string(user, "NS_SET_OFF"))) { + if(isGodMode(user)) { + printf_mysql_query("UPDATE `users` SET `user_god` = '0' WHERE `user_user` = '%s'", escape_string(user->auth)); + user->flags &= ~USERFLAG_GOD_MODE; + } + reply(getTextBot(), user, "NS_GOD_OFF"); + } else if(!strcmp(argv[0], "1") || !stricmp(argv[0], "on") || !stricmp(argv[0], get_language_string(user, "NS_SET_ON"))) { + if(!isGodMode(user)) { + printf_mysql_query("UPDATE `users` SET `user_god` = '1' WHERE `user_user` = '%s'", escape_string(user->auth)); + user->flags |= USERFLAG_GOD_MODE; + } + reply(getTextBot(), user, "NS_GOD_ON"); + } else { + reply(getTextBot(), user, "NS_SET_INVALID_BOOLEAN", argv[0]); + return; + } + } else { + if(isGodMode(user)) { + printf_mysql_query("UPDATE `users` SET `user_god` = '0' WHERE `user_user` = '%s'", escape_string(user->auth)); + user->flags &= ~USERFLAG_GOD_MODE; + reply(getTextBot(), user, "NS_GOD_OFF"); + } else { + printf_mysql_query("UPDATE `users` SET `user_god` = '1' WHERE `user_user` = '%s'", escape_string(user->auth)); + user->flags |= USERFLAG_GOD_MODE; + reply(getTextBot(), user, "NS_GOD_ON"); + } + } +} \ No newline at end of file diff --git a/src/cmd_global_netinfo.c b/src/cmd_global_netinfo.c new file mode 100644 index 0000000..a9d0466 --- /dev/null +++ b/src/cmd_global_netinfo.c @@ -0,0 +1,170 @@ +/* cmd_global_netinfo.c - NeonServ v5.2 + * 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_global.h" + +/* +* no args +*/ + +CMD_BIND(global_cmd_netinfo) { + reply(getTextBot(), user, "NS_NETINFO_HEADER"); + char tmp[MAXLEN]; + struct Table *table; + table = table_init(2, 18, 0); + char *content[2]; + + content[0] = get_language_string(user, "NS_NETINFO_UPTIME"); + content[1] = timeToStr(user, (time(0) - start_time), 3, tmp); + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_BOTS"); + struct ClientSocket *cclient; + int bot_count = 0, connected_bot_count = 0; + float traffic_in = 0, traffic_out = 0; + for(cclient = getBots(0, NULL); cclient; cclient = getBots(0, cclient)) { + bot_count++; + if(cclient->flags & SOCKET_FLAG_READY) + connected_bot_count++; + traffic_in += cclient->traffic_in; + traffic_out += cclient->traffic_out; + } + sprintf(tmp, "%d (%d connected)", bot_count, connected_bot_count); + content[1] = tmp; + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_TRAFFIC"); + sprintf(tmp, "in: %.2f kb out: %.2f kb", traffic_in / 1024, traffic_out / 1024); + content[1] = tmp; + table_add(table, content); + + int channel_count = getChannelCount(); + float channel_memory = channel_count * sizeof(struct ChanNode); + int channel_ban_count = getChanBanCount(); + float channel_ban_memory = channel_ban_count * sizeof(struct BanNode); + int user_count = getUserCount(); + float user_memory = user_count * sizeof(struct UserNode); + int chanuser_count = getChanUserCount(); + float chanuser_memory = chanuser_count * sizeof(struct ChanUser); + float total_memory = channel_memory + channel_ban_memory + user_memory + chanuser_memory; + content[0] = get_language_string(user, "NS_NETINFO_CACHE"); + sprintf(tmp, "%.2f kB (%.2f MB)", total_memory / 1024, total_memory / 1024 / 1024); + content[1] = tmp; + table_add(table, content); + content[0] = get_language_string(user, "NS_NETINFO_CHANNEL"); + sprintf(tmp, "%d %.2f kB (%d * %u B = %.2f kB)", channel_count, channel_memory / 1024, channel_count, (unsigned int) sizeof(struct ChanNode), channel_memory / 1024); + content[1] = tmp; + table_add(table, content); + content[0] = get_language_string(user, "NS_NETINFO_CHANNEL_BAN"); + sprintf(tmp, "%d %.2f kB (%d * %u B = %.2f kB)", channel_ban_count, channel_ban_memory / 1024, channel_ban_count, (unsigned int) sizeof(struct BanNode), channel_ban_memory / 1024); + content[1] = tmp; + table_add(table, content); + content[0] = get_language_string(user, "NS_NETINFO_USER"); + sprintf(tmp, "%d %.2f kB (%d * %u B = %.2f kB)", user_count, user_memory / 1024, user_count, (unsigned int) sizeof(struct UserNode), user_memory / 1024); + content[1] = tmp; + table_add(table, content); + content[0] = get_language_string(user, "NS_NETINFO_CHANUSER"); + sprintf(tmp, "%d %.2f kB (%d * %u B = %.2f kB)", chanuser_count, chanuser_memory / 1024, chanuser_count, (unsigned int) sizeof(struct ChanUser), chanuser_memory / 1024); + content[1] = tmp; + table_add(table, content); + + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SHOW TABLE STATUS"); + res = mysql_use(); + int mysql_entrys[4]; + float mysql_length[5]; + total_memory = 0; + mysql_entrys[0] = 0; mysql_entrys[1] = 0; mysql_entrys[2] = 0; mysql_entrys[3] = 0; + mysql_length[0] = 0; mysql_length[1] = 0; mysql_length[2] = 0; mysql_length[3] = 0; mysql_length[4] = 0; + while ((row = mysql_fetch_row(res)) != NULL) { + if(!stricmp(row[0], "channels")) { + mysql_entrys[0] = atoi(row[4]); + mysql_length[0] = atof(row[6]); + total_memory += atof(row[6]); + } else if(!stricmp(row[0], "bans")) { + mysql_entrys[1] = atoi(row[4]); + mysql_length[1] = atof(row[6]); + total_memory += atof(row[6]); + } else if(!stricmp(row[0], "users")) { + mysql_entrys[2] = atoi(row[4]); + mysql_length[2] = atof(row[6]); + total_memory += atof(row[6]); + } else if(!stricmp(row[0], "chanusers")) { + mysql_entrys[3] = atoi(row[4]); + mysql_length[3] = atof(row[6]); + total_memory += atof(row[6]); + } else { + mysql_length[4] += atof(row[6]); + total_memory += atof(row[6]); + } + } + + content[0] = get_language_string(user, "NS_NETINFO_DATABASE"); + sprintf(tmp, "%.2f kB (%.2f MB)", total_memory / 1024, total_memory / 1024 / 1024); + content[1] = tmp; + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_CHANNEL"); + sprintf(tmp, "%d %.2f kB", mysql_entrys[0], mysql_length[0] / 1024); + content[1] = tmp; + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_CHANNEL_BAN"); + sprintf(tmp, "%d %.2f kB", mysql_entrys[1], mysql_length[1] / 1024); + content[1] = tmp; + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_USER"); + sprintf(tmp, "%d %.2f kB", mysql_entrys[2], mysql_length[2] / 1024); + content[1] = tmp; + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_CHANUSER"); + sprintf(tmp, "%d %.2f kB", mysql_entrys[3], mysql_length[3] / 1024); + content[1] = tmp; + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_OTHER"); + sprintf(tmp, "* %.2f kB", mysql_length[4] / 1024); + content[1] = tmp; + table_add(table, content); + + if(strcmp(revision, "")) + sprintf(tmp, "%s.%d (%s)", NEONSERV_VERSION, patchlevel, revision); + else + sprintf(tmp, "%s.%d", NEONSERV_VERSION, patchlevel); + content[0] = get_language_string(user, "NS_NETINFO_VERSION"); + content[1] = tmp; + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_COMPILER"); + content[1] = build_language_string(user, tmp, "NS_NETINFO_COMPILER_VALUE", COMPILER, creation); + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_CODE"); + content[1] = build_language_string(user, tmp, "NS_NETINFO_CODE_VALUE", codelines); + 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_global_notice.c b/src/cmd_global_notice.c new file mode 100644 index 0000000..6450a8c --- /dev/null +++ b/src/cmd_global_notice.c @@ -0,0 +1,28 @@ +/* cmd_global_notice.c - NeonServ v5.2 + * 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_global.h" + +/* +* argv[0] target +* argv[1-*] message +*/ + +CMD_BIND(global_cmd_notice) { + char *message = merge_argv(argv, 1, argc); + putsock(client, "NOTICE %s :%s", argv[0], message); +} \ No newline at end of file diff --git a/src/cmd_global_raw.c b/src/cmd_global_raw.c new file mode 100644 index 0000000..3569bf2 --- /dev/null +++ b/src/cmd_global_raw.c @@ -0,0 +1,27 @@ +/* cmd_global_raw.c - NeonServ v5.2 + * 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_global.h" + +/* +* argv[0-*] raw +*/ + +CMD_BIND(global_cmd_raw) { + char *raw = merge_argv(argv, 0, argc); + putsock(client, "%s", raw); +} \ No newline at end of file diff --git a/src/cmd_global_register.c b/src/cmd_global_register.c new file mode 100644 index 0000000..08c172a --- /dev/null +++ b/src/cmd_global_register.c @@ -0,0 +1,218 @@ +/* cmd_global_register.c - NeonServ v5.2 + * 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_global.h" + +/* +* argv[0] - channel +* argv[0/1] - nick / *auth +*/ +static AUTHLOOKUP_CALLBACK(global_cmd_register_auth_lookup); +static USERAUTH_CALLBACK(global_cmd_register_nick_lookup); +static void global_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *channel, char *auth, int multibot); + +struct global_cmd_register_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct ChanNode *chan; + struct Event *event; + char *nick; + char *channel; + int multibot; +}; + +CMD_BIND(global_cmd_register) { + MYSQL_RES *res; + MYSQL_ROW row; + char *channel = argv[0]; + int multibot = 0; + if(!is_valid_chan(channel)) { + reply(getTextBot(), user, "NS_INVALID_CHANNEL_NAME", argv[0]); + return; + } + printf_mysql_query("SELECT `botid`, `botclass` FROM `bot_channels` LEFT JOIN `bots` ON `bot_channels`.`botid` = `bots`.`id` LEFT JOIN `channels` ON `bot_channels`.`chanid` = `channels`.`channel_id` WHERE `channel_name` = '%s'", escape_string(channel)); + res = mysql_use(); + while ((row = mysql_fetch_row(res)) != NULL) { + if(atoi(row[1]) == client->botid) { + reply(getTextBot(), user, "NS_REGISTER_ALREADY", argv[0], client->user->nick); + return; + } else + multibot = 1; + } + //if theres already another bot in the channel we don't need a owner parameter... + if(multibot && argc < 2) { + //skip all these owner check lines + multibot = 2; + global_cmd_register_async1(client, getTextBot(), user, chan, event, channel, NULL, multibot); + return; + } else if(argc < 2) { + reply(getTextBot(), user, "MODCMD_LESS_PARAM_COUNT"); + return; + } + //check own access + if(argv[1][0] == '*') { + //we've got an auth + argv[1]++; + printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[1])); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + global_cmd_register_async1(client, getTextBot(), user, chan, event, channel, row[0], multibot); + } else { + //we need to create a new user... + //but first lookup the auth to check if it really exists + struct global_cmd_register_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->chan = chan; + cache->event = event; + cache->nick = strdup(argv[1]); + cache->channel = strdup(channel); + cache->multibot = multibot; + lookup_authname(argv[1], global_cmd_register_auth_lookup, cache); + } + } else { + struct UserNode *cuser = getUserByNick(argv[1]); + if(!cuser) { + cuser = createTempUser(argv[1]); + cuser->flags |= USERFLAG_ISTMPUSER; + } + if(cuser->flags & USERFLAG_ISAUTHED) { + global_cmd_register_async1(client, getTextBot(), user, chan, event, channel, cuser->auth, multibot); + } else { + struct global_cmd_register_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->chan = chan; + cache->event = event; + cache->nick = strdup(argv[1]); + cache->channel = strdup(channel); + cache->multibot = multibot; + get_userauth(cuser, global_cmd_register_nick_lookup, cache); + } + } +} + +static AUTHLOOKUP_CALLBACK(global_cmd_register_auth_lookup) { + struct global_cmd_register_cache *cache = data; + if(!exists) { + //AUTH_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick); + } else + global_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, cache->channel, auth, cache->multibot); + free(cache->channel); + free(cache->nick); + free(cache); +} + +static USERAUTH_CALLBACK(global_cmd_register_nick_lookup) { + struct global_cmd_register_cache *cache = data; + if(!user) { + //USER_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick); + } + else if(!(user->flags & USERFLAG_ISAUTHED)) { + //USER_NOT_AUTHED + reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick); + } + else + global_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, cache->channel, user->auth, cache->multibot); + free(cache->channel); + free(cache->nick); + free(cache); +} + +static void global_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *channel, char *auth, int multibot) { + //we've got a valid auth now... + MYSQL_RES *res; + MYSQL_ROW row, row2; + int userid = 0, adminid; + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) + adminid = atoi(row[0]); + else + adminid = 0; + if(multibot != 2) { + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + userid = atoi(row[0]); + } else { + printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth)); + userid = (int) mysql_insert_id(mysql_conn); + } + } + printf_mysql_query("SELECT `id`, `max_channels`, `defaulttrigger` FROM `bots` WHERE `botclass` = '%d' ORDER BY `register_priority` DESC", client->botid); + res = mysql_use(); + int botid = 0; + char *bottrigger; + while ((row = mysql_fetch_row(res)) != NULL) { + //check channel count + printf_mysql_query("SELECT COUNT(*) FROM `bot_channels` WHERE `botid` = '%s'", row[0]); + row2 = mysql_fetch_row(mysql_use()); + if(atoi(row2[0]) < atoi(row[1])) { + botid = atoi(row[0]); + bottrigger = row[2]; + break; + } + } + if(!botid) { + reply(textclient, user, "NS_REGISTER_FULL"); + return; + } + int chanid; + printf_mysql_query("SELECT `channel_id` FROM `channels` WHERE `channel_name` = '%s'", escape_string(channel)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + chanid = atoi(row[0]); + printf_mysql_query("UPDATE `channels` SET `channel_registered` = UNIX_TIMESTAMP(), `channel_registrator` = '%d' WHERE `channel_id` = '%d'", adminid, chanid); + } else { + printf_mysql_query("INSERT INTO `channels` (`channel_name`, `channel_registered`, `channel_registrator`) VALUES ('%s', UNIX_TIMESTAMP(), '%d')", escape_string(channel), adminid); + chanid = (int) mysql_insert_id(mysql_conn); + } + struct ClientSocket *bot; + for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { + if(bot->clientid == botid) + break; + } + if(bot) { + putsock(bot, "JOIN %s", channel); + } else + reply(textclient, user, "NS_REGISTER_DISCONNECTED"); + printf_mysql_query("INSERT INTO `bot_channels` (`botid`, `chanid`, `trigger`) VALUES ('%d', '%d', '%s')", botid, chanid, bottrigger); + if(multibot != 2) { + if(multibot) { + printf_mysql_query("UPDATE `chanusers` SET `chanuser_access` = 499 WHERE `chanuser_cid` = '%d' AND `chanuser_access` = '500'", chanid); + printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chanid, userid); + } else + printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_cid` = '%d'", chanid); + printf_mysql_query("INSERT INTO `chanusers` (`chanuser_cid`, `chanuser_uid`, `chanuser_access`) VALUES ('%d', '%d', '%d')", chanid, userid, 500); + reply(textclient, user, "NS_REGISTER_DONE", channel, auth); + } else + reply(textclient, user, "NS_REGISTER_DONE_NOAUTH", channel); + logEvent(event); +} diff --git a/src/cmd_global_reloadlang.c b/src/cmd_global_reloadlang.c new file mode 100644 index 0000000..4516dff --- /dev/null +++ b/src/cmd_global_reloadlang.c @@ -0,0 +1,35 @@ +/* cmd_global_reloadlang.c - NeonServ v5.2 + * 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_global.h" + +/* +* argv[0] language tag +*/ + +CMD_BIND(global_cmd_reloadlang) { + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `text`, `lang` FROM `language` WHERE `ident` = 'name' AND `lang` = '%s'", escape_string(argv[0])); + res = mysql_use(); + if((row = mysql_fetch_row(res)) != NULL) { + load_language(row[1], row[0]); + reply(getTextBot(), user, "NS_RELOADLANG_DONE", row[0], row[1]); + } else { + reply(getTextBot(), user, "NS_RELOADLANG_UNKNOWN", argv[0]); + } +} \ No newline at end of file diff --git a/src/cmd_global_say.c b/src/cmd_global_say.c new file mode 100644 index 0000000..e304d12 --- /dev/null +++ b/src/cmd_global_say.c @@ -0,0 +1,28 @@ +/* cmd_global_say.c - NeonServ v5.2 + * 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_global.h" + +/* +* argv[0] target +* argv[1-*] message +*/ + +CMD_BIND(global_cmd_say) { + char *message = merge_argv(argv, 1, argc); + putsock(client, "PRIVMSG %s :%s", argv[0], message); +} \ No newline at end of file diff --git a/src/cmd_global_setaccess.c b/src/cmd_global_setaccess.c new file mode 100644 index 0000000..9f04b43 --- /dev/null +++ b/src/cmd_global_setaccess.c @@ -0,0 +1,140 @@ +/* cmd_global_setaccess.c - NeonServ v5.2 + * 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_global.h" + +/* +* argv[0] - nick / *auth +* argv[1] - global access +*/ +static AUTHLOOKUP_CALLBACK(global_cmd_setaccess_auth_lookup); +static USERAUTH_CALLBACK(global_cmd_setaccess_nick_lookup); +static void global_cmd_setaccess_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *nick, char *auth, int access); + +struct global_cmd_setaccess_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct Event *event; + int access; + char *nick; +}; + +CMD_BIND(global_cmd_setaccess) { + int caccess; + MYSQL_RES *res; + MYSQL_ROW row; + caccess = atoi(argv[1]); + if(caccess < 0 || caccess > 1000) { + reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess); + return; + } + printf_mysql_query("SELECT `user_access` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) == NULL || atoi(row[0]) < caccess) { + reply(getTextBot(), user, "NS_ACCESS_OUTRANKED"); + return; + } + if(argv[0][0] == '*') { + //we've got an auth + argv[0]++; + printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0])); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + global_cmd_setaccess_async1(client, getTextBot(), user, event, argv[0], row[0], caccess); + } else { + //we need to create a new user... + //but first lookup the auth to check if it really exists + struct global_cmd_setaccess_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->event = event; + cache->access = caccess; + cache->nick = strdup(argv[0]); + lookup_authname(argv[0], global_cmd_setaccess_auth_lookup, cache); + } + } else { + struct UserNode *cuser = getUserByNick(argv[0]); + if(!cuser) { + cuser = createTempUser(argv[0]); + cuser->flags |= USERFLAG_ISTMPUSER; + } + if(cuser->flags & USERFLAG_ISAUTHED) { + global_cmd_setaccess_async1(client, getTextBot(), user, event, argv[0], cuser->auth, caccess); + } else { + struct global_cmd_setaccess_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->event = event; + cache->access = caccess; + cache->nick = strdup(argv[0]); + get_userauth(cuser, global_cmd_setaccess_nick_lookup, cache); + } + } +} + +static AUTHLOOKUP_CALLBACK(global_cmd_setaccess_auth_lookup) { + struct global_cmd_setaccess_cache *cache = data; + if(!exists) { + //AUTH_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick); + } else + global_cmd_setaccess_async1(cache->client, cache->textclient, cache->user, cache->event, cache->nick, auth, cache->access); + free(cache->nick); + free(cache); +} + +static USERAUTH_CALLBACK(global_cmd_setaccess_nick_lookup) { + struct global_cmd_setaccess_cache *cache = data; + if(!user) { + //USER_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick); + } + else if(!(user->flags & USERFLAG_ISAUTHED)) { + //USER_NOT_AUTHED + reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick); + } + else + global_cmd_setaccess_async1(cache->client, cache->textclient, cache->user, cache->event, user->nick, user->auth, cache->access); + free(cache->nick); + free(cache); +} + +static void global_cmd_setaccess_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *nick, char *auth, int caccess) { + //we've got a valid auth now... + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `user_id`, `user_access` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + if(atoi(row[1]) != caccess) + printf_mysql_query("UPDATE `users` SET `user_access` = '%d' WHERE `user_id` = '%s'", caccess, row[0]); + } else { + printf_mysql_query("INSERT INTO `users` (`user_user`, `user_access`) VALUES ('%s', '%d')", escape_string(auth), caccess); + } + reply(textclient, user, "NS_SETACCESS_DONE", auth, caccess); + logEvent(event); +} diff --git a/src/cmd_global_unbind.c b/src/cmd_global_unbind.c new file mode 100644 index 0000000..498e803 --- /dev/null +++ b/src/cmd_global_unbind.c @@ -0,0 +1,48 @@ +/* cmd_global_unbind.c - NeonServ v5.2 + * 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_global.h" + +/* +* argv[0] command name +*/ + +CMD_BIND(global_cmd_unbind) { + MYSQL_RES *res; + MYSQL_ROW row; + struct cmd_binding *cbind = find_cmd_binding(client->botid, argv[0]); + printf_mysql_query("SELECT `function` FROM `bot_binds` WHERE `botclass` = '%d' AND `command` = '%s'", client->botid, escape_string(argv[0])); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) == NULL && (!cbind || !(cbind->flags & CMDFLAG_TEMPONARY_BIND))) { + reply(getTextBot(), user, "NS_UNBIND_NOT_FOUND", argv[0]); + return; + } + struct cmd_function *function = find_cmd_function(client->botid, row[0]); + if(function && (function->flags & CMDFLAG_REQUIRED)) { + printf_mysql_query("SELECT `id` FROM `bot_binds` WHERE `botclass` = '%d' AND `function` = '%s'", client->botid, escape_string(function->name)); + res = mysql_use(); + if (mysql_num_rows(res) <= 1) { + reply(getTextBot(), user, "NS_UNBIND_REQUIRED", function->name); + return; + } + } + unbind_cmd(client->botid, argv[0]); + if((!cbind || !(cbind->flags & CMDFLAG_TEMPONARY_BIND))) + printf_mysql_query("DELETE FROM `bot_binds` WHERE `id` = '%s'", row[0]); + reply(getTextBot(), user, "NS_UNBIND_DONE", argv[0]); + logEvent(event); +} diff --git a/src/cmd_global_unregister.c b/src/cmd_global_unregister.c new file mode 100644 index 0000000..99669af --- /dev/null +++ b/src/cmd_global_unregister.c @@ -0,0 +1,58 @@ +/* cmd_global_unregister.c - NeonServ v5.2 + * 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_global.h" + +/* +* argv[0] - channel +*/ +CMD_BIND(global_cmd_unregister) { + MYSQL_RES *res; + MYSQL_ROW row; + char *channel = argv[0]; + if(!is_valid_chan(channel)) { + reply(getTextBot(), user, "NS_INVALID_CHANNEL_NAME", argv[0]); + return; + } + int chanid; + printf_mysql_query("SELECT `channel_id` FROM `channels` WHERE `channel_name` = '%s'", escape_string(channel)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + chanid = atoi(row[0]); + } else { + reply(getTextBot(), user, "NS_UNREGISTER_NOT_REGISTERED", argv[0], client->user->nick); + return; + } + printf_mysql_query("SELECT `botid`, `bot_channels`.`id`, `suspended` FROM `bot_channels` LEFT JOIN `bots` ON `bot_channels`.`botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '%d'", chanid, client->botid); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) == NULL) { + reply(getTextBot(), user, "NS_UNREGISTER_NOT_REGISTERED", argv[0], client->user->nick); + return; + } + int botid = atoi(row[0]); + struct ClientSocket *bot; + for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { + if(bot->clientid == botid) + break; + } + if(bot && strcmp(row[2], "1")) { + putsock(bot, "PART %s :Channel unregistered.", channel); + } + printf_mysql_query("DELETE FROM `bot_channels` WHERE `id` = '%s'", row[1]); + reply(getTextBot(), user, "NS_UNREGISTER_DONE", channel); + logEvent(event); +} diff --git a/src/cmd_global_version.c b/src/cmd_global_version.c new file mode 100644 index 0000000..b3048db --- /dev/null +++ b/src/cmd_global_version.c @@ -0,0 +1,37 @@ +/* cmd_global_version.c - NeonServ v5.2 + * 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_global.h" + +/* +* no args +*/ + +CMD_BIND(global_cmd_version) { + reply(getTextBot(), user, "\002NeonServ %s.%d\002 (%s), written by pk910", NEONSERV_VERSION, patchlevel, (strcmp(revision, "") ? revision : "-")); + reply(getTextBot(), user, "Build (#%s) %s (%s lines, " COMPILER ")", compilation, creation, codelines); + reply(getTextBot(), user, "NeonServ source can be found on: http://git.pk910.de/?p=NeonServV5.git"); + //helpers :D + reply(getTextBot(), user, "special thanks to:"); + reply(getTextBot(), user, " Zer0n, TeaTow (testing and ideas current version)"); + reply(getTextBot(), user, " Buchman, Zer0n (translating current version)"); + reply(getTextBot(), user, " Patschi95, DerGrinch, Darkfly, Zer0n, Buschman (testing and ideas older versions)"); + reply(getTextBot(), user, " Buschman, Georg, richard (translating older versions)"); + reply(getTextBot(), user, "and all the other users that reported all these nasty bugs :D"); + reply(getTextBot(), user, "\002If you found a bug or if you have a good idea report it on http://bugtrack.pk910.de/git_view.php?p=NeonServV5.git\002"); + +} \ No newline at end of file diff --git a/src/cmd_neonserv.h b/src/cmd_neonserv.h index b60342f..dcdf814 100644 --- a/src/cmd_neonserv.h +++ b/src/cmd_neonserv.h @@ -46,7 +46,6 @@ CMD_BIND(neonserv_cmd_adduser); CMD_BIND(neonserv_cmd_assignrank); CMD_BIND(neonserv_cmd_ban); CMD_BIND(neonserv_cmd_bans); -CMD_BIND(neonserv_cmd_bind); CMD_BIND(neonserv_cmd_chanservsync); CMD_BIND(neonserv_cmd_clvl); CMD_BIND(neonserv_cmd_command); @@ -62,11 +61,9 @@ CMD_BIND(neonserv_cmd_devoice); CMD_BIND(neonserv_cmd_devoiceall); CMD_BIND(neonserv_cmd_down); CMD_BIND(neonserv_cmd_downall); -CMD_BIND(neonserv_cmd_emote); CMD_BIND(neonserv_cmd_events); CMD_BIND(neonserv_cmd_extscript); 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); @@ -78,22 +75,15 @@ CMD_BIND(neonserv_cmd_mdeluser); CMD_BIND(neonserv_cmd_mode); CMD_BIND(neonserv_cmd_move); CMD_BIND(neonserv_cmd_myaccess); -CMD_BIND(neonserv_cmd_netinfo); -CMD_BIND(neonserv_cmd_notice); CMD_BIND(neonserv_cmd_op); CMD_BIND(neonserv_cmd_opall); CMD_BIND(neonserv_cmd_oplog); CMD_BIND(neonserv_cmd_peek); -CMD_BIND(neonserv_cmd_raw); CMD_BIND(neonserv_cmd_recover); -CMD_BIND(neonserv_cmd_register); -CMD_BIND(neonserv_cmd_reloadlang); CMD_BIND(neonserv_cmd_rename); CMD_BIND(neonserv_cmd_resync); -CMD_BIND(neonserv_cmd_say); CMD_BIND(neonserv_cmd_search); CMD_BIND(neonserv_cmd_set); -CMD_BIND(neonserv_cmd_setaccess); CMD_BIND(neonserv_cmd_setrank); CMD_BIND(neonserv_cmd_suspend); CMD_BIND(neonserv_cmd_topic); @@ -102,15 +92,12 @@ CMD_BIND(neonserv_cmd_trim); CMD_BIND(neonserv_cmd_unban); CMD_BIND(neonserv_cmd_unbanall); CMD_BIND(neonserv_cmd_unbanme); -CMD_BIND(neonserv_cmd_unbind); -CMD_BIND(neonserv_cmd_unregister); CMD_BIND(neonserv_cmd_unsuspend); CMD_BIND(neonserv_cmd_unvisited); CMD_BIND(neonserv_cmd_up); CMD_BIND(neonserv_cmd_upall); CMD_BIND(neonserv_cmd_users); CMD_BIND(neonserv_cmd_uset); -CMD_BIND(neonserv_cmd_version); CMD_BIND(neonserv_cmd_voice); CMD_BIND(neonserv_cmd_voiceall); CMD_BIND(neonserv_cmd_wipeinfo); diff --git a/src/cmd_neonserv_bind.c b/src/cmd_neonserv_bind.c deleted file mode 100644 index 74d2402..0000000 --- a/src/cmd_neonserv_bind.c +++ /dev/null @@ -1,51 +0,0 @@ -/* cmd_neonserv_bind.c - NeonServ v5.2 - * 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" - -/* -* argv[0] command name -* argv[1] command function -* argv[2-*] parameters (optional) -*/ - -CMD_BIND(neonserv_cmd_bind) { - MYSQL_RES *res; - MYSQL_ROW row; - printf_mysql_query("SELECT `function` FROM `bot_binds` WHERE `botclass` = '%d' AND `command` = '%s'", client->botid, escape_string(argv[0])); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - reply(getTextBot(), user, "NS_BIND_ALREADY", argv[0], row[0]); - return; - } - char *params; - if(argc > 2) - params = merge_argv(argv, 2, argc); - else - params = ""; - struct cmd_function *function = find_cmd_function(client->botid, argv[1]); - if(!function) { - reply(getTextBot(), user, "NS_BIND_UNKNOWN", argv[1]); - return; - } - bind_cmd_to_function(client->botid, argv[0], function); - printf_mysql_query("INSERT INTO `bot_binds` (`botclass`, `command`, `function`, `parameters`) VALUES ('%d', '%s', '%s', '%s')", client->botid, escape_string(argv[0]), escape_string(function->name), params); - if(*params) - bind_set_parameters(client->botid, argv[0], params); - reply(getTextBot(), user, "NS_BIND_DONE", argv[0], function->name); - logEvent(event); -} diff --git a/src/cmd_neonserv_emote.c b/src/cmd_neonserv_emote.c deleted file mode 100644 index c1c53e2..0000000 --- a/src/cmd_neonserv_emote.c +++ /dev/null @@ -1,28 +0,0 @@ -/* cmd_neonserv_emote.c - NeonServ v5.2 - * 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" - -/* -* argv[0] target -* argv[1-*] message -*/ - -CMD_BIND(neonserv_cmd_emote) { - char *message = merge_argv(argv, 1, argc); - putsock(client, "PRIVMSG %s :\001ACTION %s\001", argv[0], message); -} \ No newline at end of file diff --git a/src/cmd_neonserv_god.c b/src/cmd_neonserv_god.c deleted file mode 100644 index 116bc2a..0000000 --- a/src/cmd_neonserv_god.c +++ /dev/null @@ -1,53 +0,0 @@ -/* cmd_neonserv_god.c - NeonServ v5.2 - * 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" - -/* -* argv[0] (optional) on/off -*/ - -CMD_BIND(neonserv_cmd_god) { - if(argc > 0) { - if(!strcmp(argv[0], "0") || !stricmp(argv[0], "off") || !stricmp(argv[0], get_language_string(user, "NS_SET_OFF"))) { - if(isGodMode(user)) { - printf_mysql_query("UPDATE `users` SET `user_god` = '0' WHERE `user_user` = '%s'", escape_string(user->auth)); - user->flags &= ~USERFLAG_GOD_MODE; - } - reply(getTextBot(), user, "NS_GOD_OFF"); - } else if(!strcmp(argv[0], "1") || !stricmp(argv[0], "on") || !stricmp(argv[0], get_language_string(user, "NS_SET_ON"))) { - if(!isGodMode(user)) { - printf_mysql_query("UPDATE `users` SET `user_god` = '1' WHERE `user_user` = '%s'", escape_string(user->auth)); - user->flags |= USERFLAG_GOD_MODE; - } - reply(getTextBot(), user, "NS_GOD_ON"); - } else { - reply(getTextBot(), user, "NS_SET_INVALID_BOOLEAN", argv[0]); - return; - } - } else { - if(isGodMode(user)) { - printf_mysql_query("UPDATE `users` SET `user_god` = '0' WHERE `user_user` = '%s'", escape_string(user->auth)); - user->flags &= ~USERFLAG_GOD_MODE; - reply(getTextBot(), user, "NS_GOD_OFF"); - } else { - printf_mysql_query("UPDATE `users` SET `user_god` = '1' WHERE `user_user` = '%s'", escape_string(user->auth)); - user->flags |= USERFLAG_GOD_MODE; - reply(getTextBot(), user, "NS_GOD_ON"); - } - } -} \ No newline at end of file diff --git a/src/cmd_neonserv_netinfo.c b/src/cmd_neonserv_netinfo.c deleted file mode 100644 index 5f2d306..0000000 --- a/src/cmd_neonserv_netinfo.c +++ /dev/null @@ -1,170 +0,0 @@ -/* cmd_neonserv_netinfo.c - NeonServ v5.2 - * 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 args -*/ - -CMD_BIND(neonserv_cmd_netinfo) { - reply(getTextBot(), user, "NS_NETINFO_HEADER"); - char tmp[MAXLEN]; - struct Table *table; - table = table_init(2, 18, 0); - char *content[2]; - - content[0] = get_language_string(user, "NS_NETINFO_UPTIME"); - content[1] = timeToStr(user, (time(0) - start_time), 3, tmp); - table_add(table, content); - - content[0] = get_language_string(user, "NS_NETINFO_BOTS"); - struct ClientSocket *cclient; - int bot_count = 0, connected_bot_count = 0; - float traffic_in = 0, traffic_out = 0; - for(cclient = getBots(0, NULL); cclient; cclient = getBots(0, cclient)) { - bot_count++; - if(cclient->flags & SOCKET_FLAG_READY) - connected_bot_count++; - traffic_in += cclient->traffic_in; - traffic_out += cclient->traffic_out; - } - sprintf(tmp, "%d (%d connected)", bot_count, connected_bot_count); - content[1] = tmp; - table_add(table, content); - - content[0] = get_language_string(user, "NS_NETINFO_TRAFFIC"); - sprintf(tmp, "in: %.2f kb out: %.2f kb", traffic_in / 1024, traffic_out / 1024); - content[1] = tmp; - table_add(table, content); - - int channel_count = getChannelCount(); - float channel_memory = channel_count * sizeof(struct ChanNode); - int channel_ban_count = getChanBanCount(); - float channel_ban_memory = channel_ban_count * sizeof(struct BanNode); - int user_count = getUserCount(); - float user_memory = user_count * sizeof(struct UserNode); - int chanuser_count = getChanUserCount(); - float chanuser_memory = chanuser_count * sizeof(struct ChanUser); - float total_memory = channel_memory + channel_ban_memory + user_memory + chanuser_memory; - content[0] = get_language_string(user, "NS_NETINFO_CACHE"); - sprintf(tmp, "%.2f kB (%.2f MB)", total_memory / 1024, total_memory / 1024 / 1024); - content[1] = tmp; - table_add(table, content); - content[0] = get_language_string(user, "NS_NETINFO_CHANNEL"); - sprintf(tmp, "%d %.2f kB (%d * %u B = %.2f kB)", channel_count, channel_memory / 1024, channel_count, (unsigned int) sizeof(struct ChanNode), channel_memory / 1024); - content[1] = tmp; - table_add(table, content); - content[0] = get_language_string(user, "NS_NETINFO_CHANNEL_BAN"); - sprintf(tmp, "%d %.2f kB (%d * %u B = %.2f kB)", channel_ban_count, channel_ban_memory / 1024, channel_ban_count, (unsigned int) sizeof(struct BanNode), channel_ban_memory / 1024); - content[1] = tmp; - table_add(table, content); - content[0] = get_language_string(user, "NS_NETINFO_USER"); - sprintf(tmp, "%d %.2f kB (%d * %u B = %.2f kB)", user_count, user_memory / 1024, user_count, (unsigned int) sizeof(struct UserNode), user_memory / 1024); - content[1] = tmp; - table_add(table, content); - content[0] = get_language_string(user, "NS_NETINFO_CHANUSER"); - sprintf(tmp, "%d %.2f kB (%d * %u B = %.2f kB)", chanuser_count, chanuser_memory / 1024, chanuser_count, (unsigned int) sizeof(struct ChanUser), chanuser_memory / 1024); - content[1] = tmp; - table_add(table, content); - - MYSQL_RES *res; - MYSQL_ROW row; - printf_mysql_query("SHOW TABLE STATUS"); - res = mysql_use(); - int mysql_entrys[4]; - float mysql_length[5]; - total_memory = 0; - mysql_entrys[0] = 0; mysql_entrys[1] = 0; mysql_entrys[2] = 0; mysql_entrys[3] = 0; - mysql_length[0] = 0; mysql_length[1] = 0; mysql_length[2] = 0; mysql_length[3] = 0; mysql_length[4] = 0; - while ((row = mysql_fetch_row(res)) != NULL) { - if(!stricmp(row[0], "channels")) { - mysql_entrys[0] = atoi(row[4]); - mysql_length[0] = atof(row[6]); - total_memory += atof(row[6]); - } else if(!stricmp(row[0], "bans")) { - mysql_entrys[1] = atoi(row[4]); - mysql_length[1] = atof(row[6]); - total_memory += atof(row[6]); - } else if(!stricmp(row[0], "users")) { - mysql_entrys[2] = atoi(row[4]); - mysql_length[2] = atof(row[6]); - total_memory += atof(row[6]); - } else if(!stricmp(row[0], "chanusers")) { - mysql_entrys[3] = atoi(row[4]); - mysql_length[3] = atof(row[6]); - total_memory += atof(row[6]); - } else { - mysql_length[4] += atof(row[6]); - total_memory += atof(row[6]); - } - } - - content[0] = get_language_string(user, "NS_NETINFO_DATABASE"); - sprintf(tmp, "%.2f kB (%.2f MB)", total_memory / 1024, total_memory / 1024 / 1024); - content[1] = tmp; - table_add(table, content); - - content[0] = get_language_string(user, "NS_NETINFO_CHANNEL"); - sprintf(tmp, "%d %.2f kB", mysql_entrys[0], mysql_length[0] / 1024); - content[1] = tmp; - table_add(table, content); - - content[0] = get_language_string(user, "NS_NETINFO_CHANNEL_BAN"); - sprintf(tmp, "%d %.2f kB", mysql_entrys[1], mysql_length[1] / 1024); - content[1] = tmp; - table_add(table, content); - - content[0] = get_language_string(user, "NS_NETINFO_USER"); - sprintf(tmp, "%d %.2f kB", mysql_entrys[2], mysql_length[2] / 1024); - content[1] = tmp; - table_add(table, content); - - content[0] = get_language_string(user, "NS_NETINFO_CHANUSER"); - sprintf(tmp, "%d %.2f kB", mysql_entrys[3], mysql_length[3] / 1024); - content[1] = tmp; - table_add(table, content); - - content[0] = get_language_string(user, "NS_NETINFO_OTHER"); - sprintf(tmp, "* %.2f kB", mysql_length[4] / 1024); - content[1] = tmp; - table_add(table, content); - - if(strcmp(revision, "")) - sprintf(tmp, "%s.%d (%s)", NEONSERV_VERSION, patchlevel, revision); - else - sprintf(tmp, "%s.%d", NEONSERV_VERSION, patchlevel); - content[0] = get_language_string(user, "NS_NETINFO_VERSION"); - content[1] = tmp; - table_add(table, content); - - content[0] = get_language_string(user, "NS_NETINFO_COMPILER"); - content[1] = build_language_string(user, tmp, "NS_NETINFO_COMPILER_VALUE", COMPILER, creation); - table_add(table, content); - - content[0] = get_language_string(user, "NS_NETINFO_CODE"); - content[1] = build_language_string(user, tmp, "NS_NETINFO_CODE_VALUE", codelines); - 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_notice.c b/src/cmd_neonserv_notice.c deleted file mode 100644 index 906908e..0000000 --- a/src/cmd_neonserv_notice.c +++ /dev/null @@ -1,28 +0,0 @@ -/* cmd_neonserv_notice.c - NeonServ v5.2 - * 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" - -/* -* argv[0] target -* argv[1-*] message -*/ - -CMD_BIND(neonserv_cmd_notice) { - char *message = merge_argv(argv, 1, argc); - putsock(client, "NOTICE %s :%s", argv[0], message); -} \ No newline at end of file diff --git a/src/cmd_neonserv_raw.c b/src/cmd_neonserv_raw.c deleted file mode 100644 index 5fd74cf..0000000 --- a/src/cmd_neonserv_raw.c +++ /dev/null @@ -1,27 +0,0 @@ -/* cmd_neonserv_raw.c - NeonServ v5.2 - * 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" - -/* -* argv[0-*] raw -*/ - -CMD_BIND(neonserv_cmd_raw) { - char *raw = merge_argv(argv, 0, argc); - putsock(client, "%s", raw); -} \ No newline at end of file diff --git a/src/cmd_neonserv_register.c b/src/cmd_neonserv_register.c deleted file mode 100644 index c806ca4..0000000 --- a/src/cmd_neonserv_register.c +++ /dev/null @@ -1,218 +0,0 @@ -/* cmd_neonserv_register.c - NeonServ v5.2 - * 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" - -/* -* argv[0] - channel -* argv[0/1] - nick / *auth -*/ -static AUTHLOOKUP_CALLBACK(neonserv_cmd_register_auth_lookup); -static USERAUTH_CALLBACK(neonserv_cmd_register_nick_lookup); -static void neonserv_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *channel, char *auth, int multibot); - -struct neonserv_cmd_register_cache { - struct ClientSocket *client, *textclient; - struct UserNode *user; - struct ChanNode *chan; - struct Event *event; - char *nick; - char *channel; - int multibot; -}; - -CMD_BIND(neonserv_cmd_register) { - MYSQL_RES *res; - MYSQL_ROW row; - char *channel = argv[0]; - int multibot = 0; - if(!is_valid_chan(channel)) { - reply(getTextBot(), user, "NS_INVALID_CHANNEL_NAME", argv[0]); - return; - } - printf_mysql_query("SELECT `botid`, `botclass` FROM `bot_channels` LEFT JOIN `bots` ON `bot_channels`.`botid` = `bots`.`id` LEFT JOIN `channels` ON `bot_channels`.`chanid` = `channels`.`channel_id` WHERE `channel_name` = '%s'", escape_string(channel)); - res = mysql_use(); - while ((row = mysql_fetch_row(res)) != NULL) { - if(atoi(row[1]) == client->botid) { - reply(getTextBot(), user, "NS_REGISTER_ALREADY", argv[0], client->user->nick); - return; - } else - multibot = 1; - } - //if theres already another bot in the channel we don't need a owner parameter... - if(multibot && argc < 2) { - //skip all these owner check lines - multibot = 2; - neonserv_cmd_register_async1(client, getTextBot(), user, chan, event, channel, NULL, multibot); - return; - } else if(argc < 2) { - reply(getTextBot(), user, "MODCMD_LESS_PARAM_COUNT"); - return; - } - //check own access - if(argv[1][0] == '*') { - //we've got an auth - argv[1]++; - printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[1])); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - neonserv_cmd_register_async1(client, getTextBot(), user, chan, event, channel, row[0], multibot); - } else { - //we need to create a new user... - //but first lookup the auth to check if it really exists - struct neonserv_cmd_register_cache *cache = malloc(sizeof(*cache)); - if (!cache) { - perror("malloc() failed"); - return; - } - cache->client = client; - cache->textclient = getTextBot(); - cache->user = user; - cache->chan = chan; - cache->event = event; - cache->nick = strdup(argv[1]); - cache->channel = strdup(channel); - cache->multibot = multibot; - lookup_authname(argv[1], neonserv_cmd_register_auth_lookup, cache); - } - } else { - struct UserNode *cuser = getUserByNick(argv[1]); - if(!cuser) { - cuser = createTempUser(argv[1]); - cuser->flags |= USERFLAG_ISTMPUSER; - } - if(cuser->flags & USERFLAG_ISAUTHED) { - neonserv_cmd_register_async1(client, getTextBot(), user, chan, event, channel, cuser->auth, multibot); - } else { - struct neonserv_cmd_register_cache *cache = malloc(sizeof(*cache)); - if (!cache) { - perror("malloc() failed"); - return; - } - cache->client = client; - cache->textclient = getTextBot(); - cache->user = user; - cache->chan = chan; - cache->event = event; - cache->nick = strdup(argv[1]); - cache->channel = strdup(channel); - cache->multibot = multibot; - get_userauth(cuser, neonserv_cmd_register_nick_lookup, cache); - } - } -} - -static AUTHLOOKUP_CALLBACK(neonserv_cmd_register_auth_lookup) { - struct neonserv_cmd_register_cache *cache = data; - if(!exists) { - //AUTH_DOES_NOT_EXIST - reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick); - } else - neonserv_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, cache->channel, auth, cache->multibot); - free(cache->channel); - free(cache->nick); - free(cache); -} - -static USERAUTH_CALLBACK(neonserv_cmd_register_nick_lookup) { - struct neonserv_cmd_register_cache *cache = data; - if(!user) { - //USER_DOES_NOT_EXIST - reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick); - } - else if(!(user->flags & USERFLAG_ISAUTHED)) { - //USER_NOT_AUTHED - reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick); - } - else - neonserv_cmd_register_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->event, cache->channel, user->auth, cache->multibot); - free(cache->channel); - free(cache->nick); - free(cache); -} - -static void neonserv_cmd_register_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *channel, char *auth, int multibot) { - //we've got a valid auth now... - MYSQL_RES *res; - MYSQL_ROW row, row2; - int userid = 0, adminid; - printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) - adminid = atoi(row[0]); - else - adminid = 0; - if(multibot != 2) { - printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - userid = atoi(row[0]); - } else { - printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth)); - userid = (int) mysql_insert_id(mysql_conn); - } - } - printf_mysql_query("SELECT `id`, `max_channels`, `defaulttrigger` FROM `bots` WHERE `botclass` = '%d' ORDER BY `register_priority` DESC", client->botid); - res = mysql_use(); - int botid = 0; - char *bottrigger; - while ((row = mysql_fetch_row(res)) != NULL) { - //check channel count - printf_mysql_query("SELECT COUNT(*) FROM `bot_channels` WHERE `botid` = '%s'", row[0]); - row2 = mysql_fetch_row(mysql_use()); - if(atoi(row2[0]) < atoi(row[1])) { - botid = atoi(row[0]); - bottrigger = row[2]; - break; - } - } - if(!botid) { - reply(textclient, user, "NS_REGISTER_FULL"); - return; - } - int chanid; - printf_mysql_query("SELECT `channel_id` FROM `channels` WHERE `channel_name` = '%s'", escape_string(channel)); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - chanid = atoi(row[0]); - printf_mysql_query("UPDATE `channels` SET `channel_registered` = UNIX_TIMESTAMP(), `channel_registrator` = '%d' WHERE `channel_id` = '%d'", adminid, chanid); - } else { - printf_mysql_query("INSERT INTO `channels` (`channel_name`, `channel_registered`, `channel_registrator`) VALUES ('%s', UNIX_TIMESTAMP(), '%d')", escape_string(channel), adminid); - chanid = (int) mysql_insert_id(mysql_conn); - } - struct ClientSocket *bot; - for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { - if(bot->clientid == botid) - break; - } - if(bot) { - putsock(bot, "JOIN %s", channel); - } else - reply(textclient, user, "NS_REGISTER_DISCONNECTED"); - printf_mysql_query("INSERT INTO `bot_channels` (`botid`, `chanid`, `trigger`) VALUES ('%d', '%d', '%s')", botid, chanid, bottrigger); - if(multibot != 2) { - if(multibot) { - printf_mysql_query("UPDATE `chanusers` SET `chanuser_access` = 499 WHERE `chanuser_cid` = '%d' AND `chanuser_access` = '500'", chanid); - printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chanid, userid); - } else - printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_cid` = '%d'", chanid); - printf_mysql_query("INSERT INTO `chanusers` (`chanuser_cid`, `chanuser_uid`, `chanuser_access`) VALUES ('%d', '%d', '%d')", chanid, userid, 500); - reply(textclient, user, "NS_REGISTER_DONE", channel, auth); - } else - reply(textclient, user, "NS_REGISTER_DONE_NOAUTH", channel); - logEvent(event); -} diff --git a/src/cmd_neonserv_reloadlang.c b/src/cmd_neonserv_reloadlang.c deleted file mode 100644 index 14d3f28..0000000 --- a/src/cmd_neonserv_reloadlang.c +++ /dev/null @@ -1,35 +0,0 @@ -/* cmd_neonserv_reloadlang.c - NeonServ v5.2 - * 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" - -/* -* argv[0] language tag -*/ - -CMD_BIND(neonserv_cmd_reloadlang) { - MYSQL_RES *res; - MYSQL_ROW row; - printf_mysql_query("SELECT `text`, `lang` FROM `language` WHERE `ident` = 'name' AND `lang` = '%s'", escape_string(argv[0])); - res = mysql_use(); - if((row = mysql_fetch_row(res)) != NULL) { - load_language(row[1], row[0]); - reply(getTextBot(), user, "NS_RELOADLANG_DONE", row[0], row[1]); - } else { - reply(getTextBot(), user, "NS_RELOADLANG_UNKNOWN", argv[0]); - } -} \ No newline at end of file diff --git a/src/cmd_neonserv_say.c b/src/cmd_neonserv_say.c deleted file mode 100644 index 97b9d1a..0000000 --- a/src/cmd_neonserv_say.c +++ /dev/null @@ -1,28 +0,0 @@ -/* cmd_neonserv_say.c - NeonServ v5.2 - * 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" - -/* -* argv[0] target -* argv[1-*] message -*/ - -CMD_BIND(neonserv_cmd_say) { - char *message = merge_argv(argv, 1, argc); - putsock(client, "PRIVMSG %s :%s", argv[0], message); -} \ No newline at end of file diff --git a/src/cmd_neonserv_setaccess.c b/src/cmd_neonserv_setaccess.c deleted file mode 100644 index eaf9479..0000000 --- a/src/cmd_neonserv_setaccess.c +++ /dev/null @@ -1,140 +0,0 @@ -/* cmd_neonserv_setaccess.c - NeonServ v5.2 - * 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" - -/* -* argv[0] - nick / *auth -* argv[1] - global access -*/ -static AUTHLOOKUP_CALLBACK(neonserv_cmd_setaccess_auth_lookup); -static USERAUTH_CALLBACK(neonserv_cmd_setaccess_nick_lookup); -static void neonserv_cmd_setaccess_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *nick, char *auth, int access); - -struct neonserv_cmd_setaccess_cache { - struct ClientSocket *client, *textclient; - struct UserNode *user; - struct Event *event; - int access; - char *nick; -}; - -CMD_BIND(neonserv_cmd_setaccess) { - int caccess; - MYSQL_RES *res; - MYSQL_ROW row; - caccess = atoi(argv[1]); - if(caccess < 0 || caccess > 1000) { - reply(getTextBot(), user, "NS_INVALID_ACCESS", caccess); - return; - } - printf_mysql_query("SELECT `user_access` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) == NULL || atoi(row[0]) < caccess) { - reply(getTextBot(), user, "NS_ACCESS_OUTRANKED"); - return; - } - if(argv[0][0] == '*') { - //we've got an auth - argv[0]++; - printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0])); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - neonserv_cmd_setaccess_async1(client, getTextBot(), user, event, argv[0], row[0], caccess); - } else { - //we need to create a new user... - //but first lookup the auth to check if it really exists - struct neonserv_cmd_setaccess_cache *cache = malloc(sizeof(*cache)); - if (!cache) { - perror("malloc() failed"); - return; - } - cache->client = client; - cache->textclient = getTextBot(); - cache->user = user; - cache->event = event; - cache->access = caccess; - cache->nick = strdup(argv[0]); - lookup_authname(argv[0], neonserv_cmd_setaccess_auth_lookup, cache); - } - } else { - struct UserNode *cuser = getUserByNick(argv[0]); - if(!cuser) { - cuser = createTempUser(argv[0]); - cuser->flags |= USERFLAG_ISTMPUSER; - } - if(cuser->flags & USERFLAG_ISAUTHED) { - neonserv_cmd_setaccess_async1(client, getTextBot(), user, event, argv[0], cuser->auth, caccess); - } else { - struct neonserv_cmd_setaccess_cache *cache = malloc(sizeof(*cache)); - if (!cache) { - perror("malloc() failed"); - return; - } - cache->client = client; - cache->textclient = getTextBot(); - cache->user = user; - cache->event = event; - cache->access = caccess; - cache->nick = strdup(argv[0]); - get_userauth(cuser, neonserv_cmd_setaccess_nick_lookup, cache); - } - } -} - -static AUTHLOOKUP_CALLBACK(neonserv_cmd_setaccess_auth_lookup) { - struct neonserv_cmd_setaccess_cache *cache = data; - if(!exists) { - //AUTH_DOES_NOT_EXIST - reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick); - } else - neonserv_cmd_setaccess_async1(cache->client, cache->textclient, cache->user, cache->event, cache->nick, auth, cache->access); - free(cache->nick); - free(cache); -} - -static USERAUTH_CALLBACK(neonserv_cmd_setaccess_nick_lookup) { - struct neonserv_cmd_setaccess_cache *cache = data; - if(!user) { - //USER_DOES_NOT_EXIST - reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick); - } - else if(!(user->flags & USERFLAG_ISAUTHED)) { - //USER_NOT_AUTHED - reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick); - } - else - neonserv_cmd_setaccess_async1(cache->client, cache->textclient, cache->user, cache->event, user->nick, user->auth, cache->access); - free(cache->nick); - free(cache); -} - -static void neonserv_cmd_setaccess_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *nick, char *auth, int caccess) { - //we've got a valid auth now... - MYSQL_RES *res; - MYSQL_ROW row; - printf_mysql_query("SELECT `user_id`, `user_access` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - if(atoi(row[1]) != caccess) - printf_mysql_query("UPDATE `users` SET `user_access` = '%d' WHERE `user_id` = '%s'", caccess, row[0]); - } else { - printf_mysql_query("INSERT INTO `users` (`user_user`, `user_access`) VALUES ('%s', '%d')", escape_string(auth), caccess); - } - reply(textclient, user, "NS_SETACCESS_DONE", auth, caccess); - logEvent(event); -} diff --git a/src/cmd_neonserv_unbind.c b/src/cmd_neonserv_unbind.c deleted file mode 100644 index 43f6c72..0000000 --- a/src/cmd_neonserv_unbind.c +++ /dev/null @@ -1,48 +0,0 @@ -/* cmd_neonserv_unbind.c - NeonServ v5.2 - * 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" - -/* -* argv[0] command name -*/ - -CMD_BIND(neonserv_cmd_unbind) { - MYSQL_RES *res; - MYSQL_ROW row; - struct cmd_binding *cbind = find_cmd_binding(client->botid, argv[0]); - printf_mysql_query("SELECT `function` FROM `bot_binds` WHERE `botclass` = '%d' AND `command` = '%s'", client->botid, escape_string(argv[0])); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) == NULL && (!cbind || !(cbind->flags & CMDFLAG_TEMPONARY_BIND))) { - reply(getTextBot(), user, "NS_UNBIND_NOT_FOUND", argv[0]); - return; - } - struct cmd_function *function = find_cmd_function(client->botid, row[0]); - if(function && (function->flags & CMDFLAG_REQUIRED)) { - printf_mysql_query("SELECT `id` FROM `bot_binds` WHERE `botclass` = '%d' AND `function` = '%s'", client->botid, escape_string(function->name)); - res = mysql_use(); - if (mysql_num_rows(res) <= 1) { - reply(getTextBot(), user, "NS_UNBIND_REQUIRED", function->name); - return; - } - } - unbind_cmd(client->botid, argv[0]); - if((!cbind || !(cbind->flags & CMDFLAG_TEMPONARY_BIND))) - printf_mysql_query("DELETE FROM `bot_binds` WHERE `id` = '%s'", row[0]); - reply(getTextBot(), user, "NS_UNBIND_DONE", argv[0]); - logEvent(event); -} diff --git a/src/cmd_neonserv_unregister.c b/src/cmd_neonserv_unregister.c deleted file mode 100644 index a499144..0000000 --- a/src/cmd_neonserv_unregister.c +++ /dev/null @@ -1,58 +0,0 @@ -/* cmd_neonserv_unregister.c - NeonServ v5.2 - * 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" - -/* -* argv[0] - channel -*/ -CMD_BIND(neonserv_cmd_unregister) { - MYSQL_RES *res; - MYSQL_ROW row; - char *channel = argv[0]; - if(!is_valid_chan(channel)) { - reply(getTextBot(), user, "NS_INVALID_CHANNEL_NAME", argv[0]); - return; - } - int chanid; - printf_mysql_query("SELECT `channel_id` FROM `channels` WHERE `channel_name` = '%s'", escape_string(channel)); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) != NULL) { - chanid = atoi(row[0]); - } else { - reply(getTextBot(), user, "NS_UNREGISTER_NOT_REGISTERED", argv[0], client->user->nick); - return; - } - printf_mysql_query("SELECT `botid`, `bot_channels`.`id`, `suspended` FROM `bot_channels` LEFT JOIN `bots` ON `bot_channels`.`botid` = `bots`.`id` WHERE `chanid` = '%d' AND `botclass` = '%d'", chanid, client->botid); - res = mysql_use(); - if ((row = mysql_fetch_row(res)) == NULL) { - reply(getTextBot(), user, "NS_UNREGISTER_NOT_REGISTERED", argv[0], client->user->nick); - return; - } - int botid = atoi(row[0]); - struct ClientSocket *bot; - for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { - if(bot->clientid == botid) - break; - } - if(bot && strcmp(row[2], "1")) { - putsock(bot, "PART %s :Channel unregistered.", channel); - } - printf_mysql_query("DELETE FROM `bot_channels` WHERE `id` = '%s'", row[1]); - reply(getTextBot(), user, "NS_UNREGISTER_DONE", channel); - logEvent(event); -} diff --git a/src/cmd_neonserv_version.c b/src/cmd_neonserv_version.c deleted file mode 100644 index 15e7b08..0000000 --- a/src/cmd_neonserv_version.c +++ /dev/null @@ -1,37 +0,0 @@ -/* cmd_neonserv_version.c - NeonServ v5.2 - * 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 args -*/ - -CMD_BIND(neonserv_cmd_version) { - reply(getTextBot(), user, "\002NeonServ %s.%d\002 (%s), written by pk910", NEONSERV_VERSION, patchlevel, (strcmp(revision, "") ? revision : "-")); - reply(getTextBot(), user, "Build (#%s) %s (%s lines, " COMPILER ")", compilation, creation, codelines); - reply(getTextBot(), user, "NeonServ source can be found on: http://git.pk910.de/?p=NeonServV5.git"); - //helpers :D - reply(getTextBot(), user, "special thanks to:"); - reply(getTextBot(), user, " Zer0n, TeaTow (testing and ideas current version)"); - reply(getTextBot(), user, " Buchman, Zer0n (translating current version)"); - reply(getTextBot(), user, " Patschi95, DerGrinch, Darkfly, Zer0n, Buschman (testing and ideas older versions)"); - reply(getTextBot(), user, " Buschman, Georg, richard (translating older versions)"); - reply(getTextBot(), user, "and all the other users that reported all these nasty bugs :D"); - reply(getTextBot(), user, "\002If you found a bug or if you have a good idea report it on http://bugtrack.pk910.de/git_view.php?p=NeonServV5.git\002"); - -} \ No newline at end of file diff --git a/src/commands.c b/src/commands.c new file mode 100644 index 0000000..f8da036 --- /dev/null +++ b/src/commands.c @@ -0,0 +1,130 @@ +/* commands.c - NeonServ v5.2 + * 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_global.h" +#include "cmd_neonserv.h" +#include "cmd_neonspam.h" +#include "modcmd.h" + +void register_commands() { + + //Global Commands + #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,PRIVS,FLAGS) register_command(0, NAME, FUNCTION, PARAMCOUNT, PRIVS, 0, FLAGS) + // NAME FUNCTION PARAMS PRIVS FLAGS + USER_COMMAND("version", global_cmd_version, 0, NULL, 0); + USER_COMMAND("netinfo", global_cmd_netinfo, 0, NULL, 0); + #undef USER_COMMAND + + #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(0, NAME, FUNCTION, PARAMCOUNT, NULL, GACCESS, FLAGS) + // NAME FUNCTION PARAMS ACCS FLAGS + OPER_COMMAND("register", global_cmd_register, 1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); + OPER_COMMAND("unregister", global_cmd_unregister,1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); + OPER_COMMAND("say", global_cmd_say, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); + OPER_COMMAND("emote", global_cmd_emote, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); + OPER_COMMAND("notice", global_cmd_notice, 2, 600, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); + OPER_COMMAND("raw", global_cmd_raw, 1, 800, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("god", global_cmd_god, 0, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("reloadlang", global_cmd_reloadlang,1, 500, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("bind", global_cmd_bind, 2, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); + OPER_COMMAND("unbind", global_cmd_unbind, 1, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); + OPER_COMMAND("setaccess", global_cmd_setaccess, 2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + #undef OPER_COMMAND + + //NeonServ Commands + register_bot_alias(1, "NeonServ"); + + #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,PRIVS,FLAGS) register_command(1, NAME, FUNCTION, PARAMCOUNT, PRIVS, 0, FLAGS) + // NAME FUNCTION PARAMS PRIVS FLAGS + USER_COMMAND("adduser", neonserv_cmd_adduser, 2, "#channel_canadd", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("deluser", neonserv_cmd_deluser, 1, "#channel_candel", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("clvl", neonserv_cmd_clvl, 2, "#channel_canclvl", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("access", neonserv_cmd_access, 0, NULL, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_LOG); + USER_COMMAND("users", neonserv_cmd_users, 0, NULL, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN); + USER_COMMAND("suspend", neonserv_cmd_suspend, 1, "#channel_cansuspend", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("unsuspend", neonserv_cmd_unsuspend, 1, "#channel_cansuspend", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("delme", neonserv_cmd_delme, 0, "1", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("myaccess", neonserv_cmd_myaccess, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + USER_COMMAND("up", neonserv_cmd_up, 0, "#channel_getop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("down", neonserv_cmd_down, 0, NULL, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_LOG); + USER_COMMAND("upall", neonserv_cmd_upall, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("downall", neonserv_cmd_downall, 0, NULL, CMDFLAG_LOG); + USER_COMMAND("mdeluser", neonserv_cmd_mdeluser, 2, "#channel_candel", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("trim", neonserv_cmd_trim, 2, NULL, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("giveowner", neonserv_cmd_giveowner, 1, "500", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("op", neonserv_cmd_op, 1, "#channel_canop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("deop", neonserv_cmd_deop, 1, "#channel_canop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("voice", neonserv_cmd_voice, 1, "#channel_canvoice", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("devoice", neonserv_cmd_devoice, 1, "#channel_canvoice", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("opall", neonserv_cmd_opall, 0, "#channel_canop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("deopall", neonserv_cmd_deopall, 0, "#channel_canop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("voiceall", neonserv_cmd_voiceall, 0, "#channel_canvoice", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("devoiceall", neonserv_cmd_devoiceall,0, "#channel_canvoice", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("set", neonserv_cmd_set, 0, "#channel_setters", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("kick", neonserv_cmd_kick, 1, "#channel_cankick", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("kickban", neonserv_cmd_kickban, 1, "#channel_cankick,#channel_canban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("ban", neonserv_cmd_ban, 1, "#channel_canban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("wipeinfo", neonserv_cmd_wipeinfo, 1, "#channel_wipeinfo", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("addban", neonserv_cmd_addban, 1, "#channel_staticban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("bans", neonserv_cmd_bans, 0, "1", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + USER_COMMAND("delban", neonserv_cmd_delban, 1, "#channel_staticban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("topic", neonserv_cmd_topic, 0, "#channel_changetopic", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("chanservsync", neonserv_cmd_chanservsync, 0,"500", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("resync", neonserv_cmd_resync, 0, "#channel_canresync", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("addtimeban", neonserv_cmd_addtimeban,2, "#channel_staticban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("mode", neonserv_cmd_mode, 1, "#channel_getop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("peek", neonserv_cmd_peek, 0, NULL, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN); + USER_COMMAND("uset", neonserv_cmd_uset, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + USER_COMMAND("unban", neonserv_cmd_unban, 1, "#channel_canban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("unbanall", neonserv_cmd_unbanall, 0, "#channel_canban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("unbanme", neonserv_cmd_unbanme, 0, "#channel_canban", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("invite", neonserv_cmd_invite, 1, "#channel_canop", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + USER_COMMAND("inviteme", neonserv_cmd_inviteme, 0, "#channel_getinvite", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + 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); + USER_COMMAND("extscript", neonserv_cmd_extscript, 0, NULL, CMDFLAG_EMPTY_ARGS | CMDFLAG_CHAN_PARAM); + #undef USER_COMMAND + + #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(1, NAME, FUNCTION, PARAMCOUNT, NULL, GACCESS, FLAGS) + // NAME FUNCTION PARAMS ACCS FLAGS + OPER_COMMAND("trace", neonserv_cmd_trace, 1, 400, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + OPER_COMMAND("recover", neonserv_cmd_recover, 1, 200, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); + OPER_COMMAND("csuspend", neonserv_cmd_csuspend, 1, 100, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); + OPER_COMMAND("cunsuspend", neonserv_cmd_cunsuspend,1, 100, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); + OPER_COMMAND("move", neonserv_cmd_move, 2, 300, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); + OPER_COMMAND("oplog", neonserv_cmd_oplog, 0, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("search", neonserv_cmd_search, 1, 400, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + OPER_COMMAND("addrank", neonserv_cmd_addrank, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("delrank", neonserv_cmd_delrank, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + 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("rename", neonserv_cmd_rename, 2, 300, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("unvisited", neonserv_cmd_unvisited, 0, 400, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + #undef OPER_COMMAND + + //NeonSpam Commands + register_bot_alias(2, "NeonSpam"); + + #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,PRIVS,FLAGS) register_command(2, NAME, FUNCTION, PARAMCOUNT, PRIVS, 0, FLAGS) + // NAME FUNCTION PARAMS PRIVS FLAGS + USER_COMMAND("set", neonspam_cmd_set, 0, "#channel_setters", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_LOG); + #undef USER_COMMAND + + +} \ No newline at end of file diff --git a/src/commands.h b/src/commands.h new file mode 100644 index 0000000..56a6352 --- /dev/null +++ b/src/commands.h @@ -0,0 +1,23 @@ +/* commands.h - NeonServ v5.2 + * 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 . + */ +#ifndef _commands_h +#define _commands_h +#include "main.h" + +void register_commands(); + +#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index 6c881fb..d6258a7 100644 --- a/src/main.c +++ b/src/main.c @@ -33,6 +33,7 @@ #include "ModeNode.h" #include "IRCQueue.h" #include "DBHelper.h" +#include "commands.h" #include "lib/ini.h" time_t start_time; @@ -121,6 +122,7 @@ int main(void) init_modcmd(); init_handleinfohandler(); init_tools(); + register_commands(); init_bots(); init_DBHelper(); diff --git a/src/modcmd.c b/src/modcmd.c index 3f480cd..6b769ea 100644 --- a/src/modcmd.c +++ b/src/modcmd.c @@ -35,6 +35,13 @@ struct trigger_callback { struct trigger_callback *next; }; +struct cmd_bot_alias { + int botid; + char *alias; + + struct cmd_bot_alias *next; +}; + struct command_check_user_cache { struct ClientSocket *client, *textclient; struct UserNode *user; @@ -48,6 +55,7 @@ struct command_check_user_cache { static struct cmd_binding **cmd_binds; static struct cmd_function *cmd_functions = NULL; static struct trigger_callback *trigger_callbacks = NULL; +static struct cmd_bot_alias *bot_aliases = NULL; static struct ClientSocket *tmp_text_client; static const struct default_language_entry msgtab[] = { @@ -450,7 +458,7 @@ static void got_privmsg(struct UserNode *user, struct UserNode *target, char *me int register_command(int botid, char *name, cmd_bind_t *func, int paramcount, char *channel_access, int global_access, unsigned int flags) { struct cmd_function *cmdfunc; for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) { - if(cmdfunc->botid == botid && strcmp(cmdfunc->name, name) == 0) + if((cmdfunc->botid == botid || cmdfunc->botid == 0) && strcmp(cmdfunc->name, name) == 0) return 0; } cmdfunc = malloc(sizeof(*cmdfunc)); @@ -528,8 +536,22 @@ int bind_cmd_to_function(int botid, char *cmd, struct cmd_function *func) { int bind_cmd_to_command(int botid, char *cmd, char *func) { struct cmd_function *cmdfunc; + int fbotid = botid; + char *c; + if((c = strstr(func, "."))) { + *c = '\0'; + struct cmd_bot_alias *botalias; + for(botalias = bot_aliases; botalias; botalias = botalias->next) { + if(!stricmp(botalias->alias, func)) { + fbotid = botalias->botid; + break; + } + } + *c = '.'; + func = c+1; + } for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) { - if(cmdfunc->botid == botid && strcmp(cmdfunc->name, func) == 0) + if((cmdfunc->botid == fbotid || cmdfunc->botid == 0) && strcmp(cmdfunc->name, func) == 0) break; } if(!cmdfunc) return 0; @@ -581,8 +603,21 @@ int unbind_cmd(int botid, char *cmd) { struct cmd_function *find_cmd_function(int botid, char *name) { struct cmd_function *cmdfunc; + char *c; + if((c = strstr(name, "."))) { + *c = '\0'; + struct cmd_bot_alias *botalias; + for(botalias = bot_aliases; botalias; botalias = botalias->next) { + if(!stricmp(botalias->alias, name)) { + botid = botalias->botid; + break; + } + } + *c = '.'; + name = c+1; + } for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) { - if(cmdfunc->botid == botid && stricmp(cmdfunc->name, name) == 0) + if((cmdfunc->botid == botid || cmdfunc->botid == 0) && stricmp(cmdfunc->name, name) == 0) break; } return cmdfunc; @@ -628,8 +663,15 @@ void free_modcmd() { next_cb = cb->next; free(next_cb); } + struct cmd_bot_alias *botalias, *next_botalias; + for(botalias = bot_aliases; botalias; botalias = next_botalias) { + next_botalias = botalias->next; + free(botalias->alias); + free(botalias); + } cmd_functions = NULL; trigger_callbacks = NULL; + bot_aliases = NULL; } void bind_set_parameters(int botid, char *cmd, char *parameters) { @@ -706,7 +748,7 @@ void bind_unbound_required_functions(int botid) { int i, found; struct cmd_binding *cbind; for(cmdfunc = cmd_functions; cmdfunc; cmdfunc = cmdfunc->next) { - if(cmdfunc->botid == botid && (cmdfunc->flags & CMDFLAG_REQUIRED)) { + if((cmdfunc->flags & CMDFLAG_REQUIRED)) { found = 0; for(i = 0; i < 27; i++) { for(cbind = cmd_binds[i]; cbind; cbind = cbind->next) { @@ -726,3 +768,20 @@ void bind_unbound_required_functions(int botid) { } } +void register_bot_alias(int botid, char *alias) { + struct cmd_bot_alias *botalias; + for(botalias = bot_aliases; botalias; botalias = botalias->next) { + if(!stricmp(botalias->alias, alias)) + return; + } + botalias = malloc(sizeof(*botalias)); + if (!botalias) { + perror("malloc() failed"); + return; + } + botalias->botid = botid; + botalias->alias = strdup(alias); + botalias->next = bot_aliases; + bot_aliases = botalias; +} + diff --git a/src/modcmd.h b/src/modcmd.h index a2d8447..4009768 100644 --- a/src/modcmd.h +++ b/src/modcmd.h @@ -92,4 +92,6 @@ void bind_set_channel_access(int botid, char *cmd, char *chanaccess); struct cmd_binding *find_cmd_binding(int botid, char *cmd); void bind_unbound_required_functions(int botid); +void register_bot_alias(int botid, char *alias); + #endif \ No newline at end of file