From 706e48b1e666054030c491d864f740071e390038 Mon Sep 17 00:00:00 2001 From: pk910 Date: Sat, 11 Feb 2012 22:21:50 +0100 Subject: [PATCH] rearranged NeonServ code to be modular --- src/BanNode.h | 4 +- src/ChanNode.h | 15 +- src/ChanUser.h | 13 +- src/ClientSocket.h | 19 +- src/ConfigParser.h | 9 +- src/DBHelper.h | 26 +- src/EventLogger.h | 7 +- src/HandleInfoHandler.h | 7 +- src/IRCEvents.c | 23 +- src/IRCEvents.h | 119 +++-- src/IRCParser.h | 11 +- src/ModeNode.h | 29 +- src/UserNode.h | 21 +- src/WHOHandler.c | 21 +- src/WHOHandler.h | 16 +- src/bots.c | 19 - src/bots.h | 19 +- src/commands.h | 23 - src/lang.c | 17 +- src/lang.h | 19 +- src/main.c | 24 +- src/main.h | 159 +------ src/memoryDebug.c | 29 -- src/memoryDebug.h | 12 +- src/memoryInfo.h | 14 +- src/modcmd.c | 62 ++- src/modcmd.h | 72 ++-- src/modules.c | 407 ++++++++++++++++++ src/modules.h | 26 ++ .../DummyServ.mod}/bot_DummyServ.c | 51 ++- .../DummyServ.mod}/bot_DummyServ.h | 4 +- src/modules/DummyServ.mod/module.c | 36 ++ src/{ => modules/NeonHelp.mod}/bot_NeonHelp.c | 52 ++- src/{ => modules/NeonHelp.mod}/bot_NeonHelp.h | 4 +- src/modules/NeonHelp.mod/cmd_neonhelp.c | 34 ++ src/{ => modules/NeonHelp.mod}/cmd_neonhelp.h | 3 + .../NeonHelp.mod}/cmd_neonhelp_delete.c | 0 .../NeonHelp.mod}/cmd_neonhelp_next.c | 0 .../NeonHelp.mod}/cmd_neonhelp_requests.c | 0 .../NeonHelp.mod}/cmd_neonhelp_stats.c | 0 src/modules/NeonHelp.mod/module.c | 38 ++ src/{ => modules/NeonServ.mod}/bot_NeonServ.c | 74 ++-- src/{ => modules/NeonServ.mod}/bot_NeonServ.h | 4 +- .../NeonServ.mod/cmd_neonserv.c} | 84 +--- src/{ => modules/NeonServ.mod}/cmd_neonserv.h | 3 + .../NeonServ.mod}/cmd_neonserv_access.c | 0 .../NeonServ.mod}/cmd_neonserv_addban.c | 0 .../NeonServ.mod}/cmd_neonserv_addrank.c | 0 .../NeonServ.mod}/cmd_neonserv_addtimeban.c | 0 .../NeonServ.mod}/cmd_neonserv_adduser.c | 0 .../NeonServ.mod}/cmd_neonserv_assignrank.c | 0 .../NeonServ.mod}/cmd_neonserv_ban.c | 0 .../NeonServ.mod}/cmd_neonserv_bans.c | 0 .../NeonServ.mod}/cmd_neonserv_chanservsync.c | 0 .../NeonServ.mod}/cmd_neonserv_clvl.c | 0 .../NeonServ.mod}/cmd_neonserv_csuspend.c | 0 .../NeonServ.mod}/cmd_neonserv_cunsuspend.c | 0 .../NeonServ.mod}/cmd_neonserv_dehalfop.c | 0 .../NeonServ.mod}/cmd_neonserv_dehalfopall.c | 0 .../NeonServ.mod}/cmd_neonserv_delban.c | 0 .../NeonServ.mod}/cmd_neonserv_delme.c | 0 .../NeonServ.mod}/cmd_neonserv_delrank.c | 0 .../NeonServ.mod}/cmd_neonserv_deluser.c | 0 .../NeonServ.mod}/cmd_neonserv_deop.c | 0 .../NeonServ.mod}/cmd_neonserv_deopall.c | 0 .../NeonServ.mod}/cmd_neonserv_devoice.c | 0 .../NeonServ.mod}/cmd_neonserv_devoiceall.c | 0 .../NeonServ.mod}/cmd_neonserv_down.c | 0 .../NeonServ.mod}/cmd_neonserv_downall.c | 0 .../NeonServ.mod}/cmd_neonserv_events.c | 0 .../NeonServ.mod}/cmd_neonserv_extscript.c | 0 .../NeonServ.mod}/cmd_neonserv_giveowner.c | 0 .../NeonServ.mod}/cmd_neonserv_halfop.c | 0 .../NeonServ.mod}/cmd_neonserv_halfopall.c | 0 .../NeonServ.mod}/cmd_neonserv_help.c | 0 .../NeonServ.mod}/cmd_neonserv_info.c | 0 .../NeonServ.mod}/cmd_neonserv_invite.c | 0 .../NeonServ.mod}/cmd_neonserv_inviteme.c | 0 .../NeonServ.mod}/cmd_neonserv_kick.c | 0 .../NeonServ.mod}/cmd_neonserv_kickban.c | 0 .../NeonServ.mod}/cmd_neonserv_listrank.c | 0 .../NeonServ.mod}/cmd_neonserv_mdeluser.c | 0 .../NeonServ.mod}/cmd_neonserv_mode.c | 0 .../NeonServ.mod}/cmd_neonserv_move.c | 0 .../NeonServ.mod}/cmd_neonserv_myaccess.c | 0 .../NeonServ.mod}/cmd_neonserv_nicklist.c | 0 .../NeonServ.mod}/cmd_neonserv_noregister.c | 0 .../NeonServ.mod}/cmd_neonserv_op.c | 0 .../NeonServ.mod}/cmd_neonserv_opall.c | 0 .../NeonServ.mod}/cmd_neonserv_oplog.c | 0 .../NeonServ.mod}/cmd_neonserv_peek.c | 0 .../NeonServ.mod}/cmd_neonserv_recover.c | 0 .../NeonServ.mod}/cmd_neonserv_rename.c | 0 .../NeonServ.mod}/cmd_neonserv_resync.c | 0 .../NeonServ.mod}/cmd_neonserv_search.c | 0 .../NeonServ.mod}/cmd_neonserv_set.c | 0 .../NeonServ.mod}/cmd_neonserv_setrank.c | 0 .../NeonServ.mod}/cmd_neonserv_suspend.c | 0 .../NeonServ.mod}/cmd_neonserv_topic.c | 0 .../NeonServ.mod}/cmd_neonserv_trace.c | 0 .../NeonServ.mod}/cmd_neonserv_trim.c | 0 .../NeonServ.mod}/cmd_neonserv_unban.c | 0 .../NeonServ.mod}/cmd_neonserv_unbanall.c | 0 .../NeonServ.mod}/cmd_neonserv_unbanme.c | 0 .../NeonServ.mod}/cmd_neonserv_unsuspend.c | 0 .../NeonServ.mod}/cmd_neonserv_unvisited.c | 0 .../NeonServ.mod}/cmd_neonserv_up.c | 1 - .../NeonServ.mod}/cmd_neonserv_upall.c | 0 .../NeonServ.mod}/cmd_neonserv_users.c | 0 .../NeonServ.mod}/cmd_neonserv_uset.c | 0 .../NeonServ.mod}/cmd_neonserv_voice.c | 0 .../NeonServ.mod}/cmd_neonserv_voiceall.c | 0 .../NeonServ.mod}/cmd_neonserv_wipeinfo.c | 0 .../NeonServ.mod}/event_neonserv_ctcp.c | 0 .../NeonServ.mod}/event_neonserv_invite.c | 0 .../NeonServ.mod}/event_neonserv_join.c | 0 .../NeonServ.mod}/event_neonserv_kick.c | 0 .../NeonServ.mod}/event_neonserv_mode.c | 0 .../NeonServ.mod}/event_neonserv_notice.c | 0 .../NeonServ.mod}/event_neonserv_part.c | 0 .../NeonServ.mod}/event_neonserv_quit.c | 0 .../NeonServ.mod}/event_neonserv_topic.c | 0 src/modules/NeonServ.mod/module.c | 38 ++ src/{ => modules/NeonSpam.mod}/bot_NeonSpam.c | 48 ++- src/{ => modules/NeonSpam.mod}/bot_NeonSpam.h | 4 +- src/modules/NeonSpam.mod/cmd_neonspam.c | 32 ++ src/{ => modules/NeonSpam.mod}/cmd_neonspam.h | 0 .../NeonSpam.mod}/cmd_neonspam_set.c | 0 .../NeonSpam.mod}/event_neonspam_chanmsg.c | 0 .../NeonSpam.mod}/event_neonspam_join.c | 0 src/modules/NeonSpam.mod/module.c | 38 ++ src/{ => modules/funcmd.mod}/cmd_funcmds.c | 16 +- src/{ => modules/funcmd.mod}/cmd_funcmds.h | 2 + src/modules/funcmd.mod/module.c | 38 ++ src/modules/global.mod/cmd_global.c | 59 +++ src/{ => modules/global.mod}/cmd_global.h | 3 + .../global.mod}/cmd_global_addbot.c | 0 .../global.mod}/cmd_global_bind.c | 0 .../global.mod}/cmd_global_bots.c | 0 .../global.mod}/cmd_global_command.c | 0 .../global.mod}/cmd_global_commands.c | 0 .../global.mod}/cmd_global_delbot.c | 0 src/{ => modules/global.mod}/cmd_global_die.c | 0 .../global.mod}/cmd_global_emote.c | 0 src/{ => modules/global.mod}/cmd_global_god.c | 0 .../global.mod}/cmd_global_meminfo.c | 0 .../global.mod}/cmd_global_modcmd.c | 0 .../global.mod}/cmd_global_motd.c | 0 .../global.mod}/cmd_global_netinfo.c | 0 .../global.mod}/cmd_global_notice.c | 0 src/{ => modules/global.mod}/cmd_global_raw.c | 0 .../global.mod}/cmd_global_reconnect.c | 0 .../global.mod}/cmd_global_register.c | 0 .../global.mod}/cmd_global_reload.c | 0 .../global.mod}/cmd_global_reloadlang.c | 0 .../global.mod}/cmd_global_restart.c | 0 src/{ => modules/global.mod}/cmd_global_say.c | 0 .../global.mod}/cmd_global_setaccess.c | 0 .../global.mod}/cmd_global_setbot.c | 2 +- .../global.mod}/cmd_global_staff.c | 0 .../global.mod}/cmd_global_unbind.c | 0 .../global.mod}/cmd_global_unregister.c | 0 .../global.mod}/cmd_global_version.c | 0 src/modules/global.mod/module.c | 37 ++ src/modules/module.h | 241 +++++++++++ src/mysqlConn.c | 6 +- src/mysqlConn.h | 19 +- src/overall.h | 159 +++++++ src/timeq.c | 33 +- src/timeq.h | 21 +- src/tools.h | 51 +-- src/version.h | 7 +- 172 files changed, 1828 insertions(+), 656 deletions(-) delete mode 100644 src/commands.h create mode 100644 src/modules.c create mode 100644 src/modules.h rename src/{ => modules/DummyServ.mod}/bot_DummyServ.c (69%) rename src/{ => modules/DummyServ.mod}/bot_DummyServ.h (92%) create mode 100644 src/modules/DummyServ.mod/module.c rename src/{ => modules/NeonHelp.mod}/bot_NeonHelp.c (93%) rename src/{ => modules/NeonHelp.mod}/bot_NeonHelp.h (94%) create mode 100644 src/modules/NeonHelp.mod/cmd_neonhelp.c rename src/{ => modules/NeonHelp.mod}/cmd_neonhelp.h (95%) rename src/{ => modules/NeonHelp.mod}/cmd_neonhelp_delete.c (100%) rename src/{ => modules/NeonHelp.mod}/cmd_neonhelp_next.c (100%) rename src/{ => modules/NeonHelp.mod}/cmd_neonhelp_requests.c (100%) rename src/{ => modules/NeonHelp.mod}/cmd_neonhelp_stats.c (100%) create mode 100644 src/modules/NeonHelp.mod/module.c rename src/{ => modules/NeonServ.mod}/bot_NeonServ.c (94%) rename src/{ => modules/NeonServ.mod}/bot_NeonServ.h (93%) rename src/{commands.c => modules/NeonServ.mod/cmd_neonserv.c} (66%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv.h (98%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_access.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_addban.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_addrank.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_addtimeban.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_adduser.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_assignrank.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_ban.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_bans.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_chanservsync.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_clvl.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_csuspend.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_cunsuspend.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_dehalfop.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_dehalfopall.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_delban.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_delme.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_delrank.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_deluser.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_deop.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_deopall.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_devoice.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_devoiceall.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_down.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_downall.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_events.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_extscript.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_giveowner.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_halfop.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_halfopall.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_help.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_info.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_invite.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_inviteme.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_kick.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_kickban.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_listrank.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_mdeluser.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_mode.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_move.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_myaccess.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_nicklist.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_noregister.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_op.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_opall.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_oplog.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_peek.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_recover.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_rename.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_resync.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_search.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_set.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_setrank.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_suspend.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_topic.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_trace.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_trim.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_unban.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_unbanall.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_unbanme.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_unsuspend.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_unvisited.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_up.c (99%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_upall.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_users.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_uset.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_voice.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_voiceall.c (100%) rename src/{ => modules/NeonServ.mod}/cmd_neonserv_wipeinfo.c (100%) rename src/{ => modules/NeonServ.mod}/event_neonserv_ctcp.c (100%) rename src/{ => modules/NeonServ.mod}/event_neonserv_invite.c (100%) rename src/{ => modules/NeonServ.mod}/event_neonserv_join.c (100%) rename src/{ => modules/NeonServ.mod}/event_neonserv_kick.c (100%) rename src/{ => modules/NeonServ.mod}/event_neonserv_mode.c (100%) rename src/{ => modules/NeonServ.mod}/event_neonserv_notice.c (100%) rename src/{ => modules/NeonServ.mod}/event_neonserv_part.c (100%) rename src/{ => modules/NeonServ.mod}/event_neonserv_quit.c (100%) rename src/{ => modules/NeonServ.mod}/event_neonserv_topic.c (100%) create mode 100644 src/modules/NeonServ.mod/module.c rename src/{ => modules/NeonSpam.mod}/bot_NeonSpam.c (90%) rename src/{ => modules/NeonSpam.mod}/bot_NeonSpam.h (98%) create mode 100644 src/modules/NeonSpam.mod/cmd_neonspam.c rename src/{ => modules/NeonSpam.mod}/cmd_neonspam.h (100%) rename src/{ => modules/NeonSpam.mod}/cmd_neonspam_set.c (100%) rename src/{ => modules/NeonSpam.mod}/event_neonspam_chanmsg.c (100%) rename src/{ => modules/NeonSpam.mod}/event_neonspam_join.c (100%) create mode 100644 src/modules/NeonSpam.mod/module.c rename src/{ => modules/funcmd.mod}/cmd_funcmds.c (87%) rename src/{ => modules/funcmd.mod}/cmd_funcmds.h (94%) create mode 100644 src/modules/funcmd.mod/module.c create mode 100644 src/modules/global.mod/cmd_global.c rename src/{ => modules/global.mod}/cmd_global.h (97%) rename src/{ => modules/global.mod}/cmd_global_addbot.c (100%) rename src/{ => modules/global.mod}/cmd_global_bind.c (100%) rename src/{ => modules/global.mod}/cmd_global_bots.c (100%) rename src/{ => modules/global.mod}/cmd_global_command.c (100%) rename src/{ => modules/global.mod}/cmd_global_commands.c (100%) rename src/{ => modules/global.mod}/cmd_global_delbot.c (100%) rename src/{ => modules/global.mod}/cmd_global_die.c (100%) rename src/{ => modules/global.mod}/cmd_global_emote.c (100%) rename src/{ => modules/global.mod}/cmd_global_god.c (100%) rename src/{ => modules/global.mod}/cmd_global_meminfo.c (100%) rename src/{ => modules/global.mod}/cmd_global_modcmd.c (100%) rename src/{ => modules/global.mod}/cmd_global_motd.c (100%) rename src/{ => modules/global.mod}/cmd_global_netinfo.c (100%) rename src/{ => modules/global.mod}/cmd_global_notice.c (100%) rename src/{ => modules/global.mod}/cmd_global_raw.c (100%) rename src/{ => modules/global.mod}/cmd_global_reconnect.c (100%) rename src/{ => modules/global.mod}/cmd_global_register.c (100%) rename src/{ => modules/global.mod}/cmd_global_reload.c (100%) rename src/{ => modules/global.mod}/cmd_global_reloadlang.c (100%) rename src/{ => modules/global.mod}/cmd_global_restart.c (100%) rename src/{ => modules/global.mod}/cmd_global_say.c (100%) rename src/{ => modules/global.mod}/cmd_global_setaccess.c (100%) rename src/{ => modules/global.mod}/cmd_global_setbot.c (99%) rename src/{ => modules/global.mod}/cmd_global_staff.c (100%) rename src/{ => modules/global.mod}/cmd_global_unbind.c (100%) rename src/{ => modules/global.mod}/cmd_global_unregister.c (100%) rename src/{ => modules/global.mod}/cmd_global_version.c (100%) create mode 100644 src/modules/global.mod/module.c create mode 100644 src/modules/module.h create mode 100644 src/overall.h diff --git a/src/BanNode.h b/src/BanNode.h index 2367eb8..028b599 100644 --- a/src/BanNode.h +++ b/src/BanNode.h @@ -27,10 +27,12 @@ struct BanNode { struct BanNode *next; }; +#ifndef DND_FUNCTIONS struct BanNode* addChannelBan(struct ChanNode *chan, char *mask); -struct BanNode* getMatchingChannelBan(struct ChanNode *chan, char *mask); +/* MODULAR ACCESSIBLE */ struct BanNode* getMatchingChannelBan(struct ChanNode *chan, char *mask); void removeChannelBanMask(struct ChanNode *chan, char *mask); void removeChannelBan(struct BanNode *ban); void removeChannelBans(struct ChanNode *chan); +#endif #endif \ No newline at end of file diff --git a/src/ChanNode.h b/src/ChanNode.h index d0bb4a5..38a1d89 100644 --- a/src/ChanNode.h +++ b/src/ChanNode.h @@ -49,17 +49,18 @@ struct ChanNode { struct ChanNode *next; }; +#ifndef DND_FUNCTIONS void init_ChanNode(); void free_ChanNode(); -int is_valid_chan(const char *name); -struct ChanNode* getAllChans(struct ChanNode *last); -struct ChanNode* getChanByName(const char *name); +/* MODULAR ACCESSIBLE */ int is_valid_chan(const char *name); +/* MODULAR ACCESSIBLE */ struct ChanNode* getAllChans(struct ChanNode *last); +/* MODULAR ACCESSIBLE */ struct ChanNode* getChanByName(const char *name); struct ChanNode* addChannel(const char *chan); -int getChannelCount(); -int getChanUserCount(); -int getChanBanCount(); +/* MODULAR ACCESSIBLE */ int getChannelCount(); +/* MODULAR ACCESSIBLE */ int getChanUserCount(); +/* MODULAR ACCESSIBLE */ int getChanBanCount(); void delChannel(struct ChanNode* chan, int freeChan); void freeChanNode(struct ChanNode* chan); int checkChannelVisibility(struct ChanNode* chan); - +#endif #endif \ No newline at end of file diff --git a/src/ChanUser.h b/src/ChanUser.h index 00bfc97..3e5ca8a 100644 --- a/src/ChanUser.h +++ b/src/ChanUser.h @@ -43,14 +43,15 @@ struct ChanUser { struct ChanUser *next_chan; }; +#ifndef DND_FUNCTIONS struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user); struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user); -int isUserOnChan(struct UserNode *user, struct ChanNode *chan); -struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan); -struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last); -struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last); +/* MODULAR ACCESSIBLE */ int isUserOnChan(struct UserNode *user, struct ChanNode *chan); +/* MODULAR ACCESSIBLE */ struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan); +/* MODULAR ACCESSIBLE */ struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last); +/* MODULAR ACCESSIBLE */ struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last); void delChanUser(struct ChanUser *chanuser, int freeChanUser); void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int freeChanUser); void freeChanUser(struct ChanUser *chanuser); - -#endif \ No newline at end of file +#endif +#endif diff --git a/src/ClientSocket.h b/src/ClientSocket.h index 78e207c..34db5d6 100644 --- a/src/ClientSocket.h +++ b/src/ClientSocket.h @@ -77,19 +77,20 @@ struct ClientSocket { struct ClientSocket *next; }; -struct ClientSocket* create_socket(char *host, int port, char *bindto, char *pass, char *nick, char *ident, char *realname); -int connect_socket(struct ClientSocket *client); -int close_socket(struct ClientSocket *client); -int disconnect_socket(struct ClientSocket *client); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ struct ClientSocket* create_socket(char *host, int port, char *bindto, char *pass, char *nick, char *ident, char *realname); +/* MODULAR ACCESSIBLE */ int connect_socket(struct ClientSocket *client); +/* MODULAR ACCESSIBLE */ int close_socket(struct ClientSocket *client); +/* MODULAR ACCESSIBLE */ int disconnect_socket(struct ClientSocket *client); int write_socket_force(struct ClientSocket *client, char* msg, int len); -int write_socket(struct ClientSocket *client, char* msg, int len); +/* MODULAR ACCESSIBLE */ int write_socket(struct ClientSocket *client, char* msg, int len); #ifdef HAVE_THREADS int clientsocket_parseorder_top(unsigned int tid); #endif int socket_loop(int timeout_seconds); -void putsock(struct ClientSocket *client, const char *text, ...) PRINTF_LIKE(2, 3); -struct ClientSocket* getBots(int flags, struct ClientSocket* last_bot); +/* MODULAR ACCESSIBLE */ void putsock(struct ClientSocket *client, const char *text, ...) PRINTF_LIKE(2, 3); +/* MODULAR ACCESSIBLE */ struct ClientSocket* getBots(int flags, struct ClientSocket* last_bot); void init_sockets(); void free_sockets(); - -#endif \ No newline at end of file +#endif +#endif diff --git a/src/ConfigParser.h b/src/ConfigParser.h index 231871c..fb529da 100644 --- a/src/ConfigParser.h +++ b/src/ConfigParser.h @@ -19,9 +19,10 @@ #define _ConfigParser_h #include "main.h" +#ifndef DND_FUNCTIONS int loadConfig(const char *filename); -int get_int_field(char *field_path); -char *get_string_field(char *field_path); +/* MODULAR ACCESSIBLE */ int get_int_field(char *field_path); +/* MODULAR ACCESSIBLE */ char *get_string_field(char *field_path); void free_loaded_config(); - -#endif \ No newline at end of file +#endif +#endif diff --git a/src/DBHelper.h b/src/DBHelper.h index 01658f4..55c782c 100644 --- a/src/DBHelper.h +++ b/src/DBHelper.h @@ -25,21 +25,25 @@ struct ChanNode; #define DB_CHANUSER_AUTOINVITE 0x02 #define DB_CHANUSER_NOAUTOOP 0x04 -void _loadUserSettings(struct UserNode* user); #define loadUserSettings(USER) if((USER->flags & USERFLAG_ISAUTHED) && !(USER->flags & USERFLAG_LOADED_SETTINGS)) _loadUserSettings(USER) -int isGodMode(struct UserNode *user); -char *getChanDefault(char *channel_setting); -int getChannelAccess(struct UserNode *user, struct ChanNode *chan); -int checkChannelAccess(struct UserNode *user, struct ChanNode *chan, char *channel_setting, int allow_501); -void _loadChannelSettings(struct ChanNode *chan); #define loadChannelSettings(CHAN) if(!(CHAN->flags & CHANFLAG_REQUESTED_CHANINFO)) _loadChannelSettings(CHAN) -int isUserProtected(struct ChanNode *chan, struct UserNode *victim, struct UserNode *issuer); -char *getBanAffectingMask(struct ChanNode *chan, char *mask); //returns bans that match a given mask eg. *!*@ab* if you pass *!*@abcdefg.* +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ void _loadUserSettings(struct UserNode* user); +/* MODULAR ACCESSIBLE */ int isGodMode(struct UserNode *user); +/* MODULAR ACCESSIBLE */ char *getChanDefault(char *channel_setting); +/* MODULAR ACCESSIBLE */ int getChannelAccess(struct UserNode *user, struct ChanNode *chan); +/* MODULAR ACCESSIBLE */ int checkChannelAccess(struct UserNode *user, struct ChanNode *chan, char *channel_setting, int allow_501); +/* MODULAR ACCESSIBLE */ void _loadChannelSettings(struct ChanNode *chan); -int renameAccount(char *oldauth, char *newauth); +/* MODULAR ACCESSIBLE */ int isUserProtected(struct ChanNode *chan, struct UserNode *victim, struct UserNode *issuer); -void deleteUser(int userid); +/* MODULAR ACCESSIBLE */ char *getBanAffectingMask(struct ChanNode *chan, char *mask); //returns bans that match a given mask eg. *!*@ab* if you pass *!*@abcdefg.* + +/* MODULAR ACCESSIBLE */ int renameAccount(char *oldauth, char *newauth); + +/* MODULAR ACCESSIBLE */ void deleteUser(int userid); void init_DBHelper(); -#endif \ No newline at end of file +#endif +#endif diff --git a/src/EventLogger.h b/src/EventLogger.h index 4b8927c..312aa21 100644 --- a/src/EventLogger.h +++ b/src/EventLogger.h @@ -35,8 +35,9 @@ struct Event { struct Event *next; }; +#ifndef DND_FUNCTIONS struct Event *createEvent(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct cmd_binding *command, char **args, int argc, int flags); -void logEvent(struct Event *event); +/* MODULAR ACCESSIBLE */ void logEvent(struct Event *event); void destroyEvents(); - -#endif \ No newline at end of file +#endif +#endif diff --git a/src/HandleInfoHandler.h b/src/HandleInfoHandler.h index d5bb9bd..c44b9a1 100644 --- a/src/HandleInfoHandler.h +++ b/src/HandleInfoHandler.h @@ -25,9 +25,10 @@ struct UserNode; #define AUTHLOOKUP_CALLBACK(NAME) void NAME(UNUSED_ARG(char *auth), UNUSED_ARG(int exists), UNUSED_ARG(time_t registered), UNUSED_ARG(void *data)) typedef AUTHLOOKUP_CALLBACK(authlookup_callback_t); +#ifndef DND_FUNCTIONS void clear_handleinfoqueue(struct ClientSocket *client); -void lookup_authname(char *auth, authlookup_callback_t callback, void *data); +/* MODULAR ACCESSIBLE */ void lookup_authname(char *auth, authlookup_callback_t callback, void *data); void init_handleinfohandler(); void free_handleinfohandler(); - -#endif \ No newline at end of file +#endif +#endif diff --git a/src/IRCEvents.c b/src/IRCEvents.c index eb29a09..9e0222b 100644 --- a/src/IRCEvents.c +++ b/src/IRCEvents.c @@ -24,6 +24,7 @@ struct binding { void *func; + int module_id; struct binding *next; }; @@ -66,6 +67,25 @@ void free_bind() { free(binds); } +void unregister_module_events(int module_id) { + struct binding *cbind, *next, *prev; + int i; + for(i = 0; i < TOTAL_BIND_TYPES; i++) { + prev = NULL; + for(cbind = binds[i]; cbind; cbind = next) { + next = cbind->next; + if(cbind->module_id == module_id) { + if(prev) + prev->next = next; + else + binds[i] = next; + free(cbind); + } else + prev = cbind; + } + } +} + static int is_bound(unsigned char type, void *func) { struct binding *cbind; for(cbind = binds[type]; cbind; cbind = cbind->next) { @@ -76,7 +96,7 @@ static int is_bound(unsigned char type, void *func) { } #define FUNC_BIND(NAME,FUNCTYPE,TYPE) \ -int bind_##NAME(FUNCTYPE *func) { \ +int bind_##NAME(FUNCTYPE *func, int module_id) { \ if(!is_bound(TYPE, func)) { \ struct binding *cbind = malloc(sizeof(*cbind)); \ if (!cbind) { \ @@ -84,6 +104,7 @@ int bind_##NAME(FUNCTYPE *func) { \ return 0; \ } \ cbind->func = func; \ + cbind->module_id = module_id \ cbind->next = binds[TYPE]; \ binds[TYPE] = cbind; \ return 1; \ diff --git a/src/IRCEvents.h b/src/IRCEvents.h index ceccd64..ff4b972 100644 --- a/src/IRCEvents.h +++ b/src/IRCEvents.h @@ -24,102 +24,143 @@ struct ChanNode; struct ChanUser; struct ClientSocket; +#ifndef DND_FUNCTIONS void init_bind(); void free_bind(); +void unregister_module_events(int module_id); +#endif typedef void join_func_t(struct ChanUser *chanuser); -int bind_join(join_func_t *func); -void unbind_join(join_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_join(join_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_join(join_func_t *func); int event_join(struct ChanUser *chanuser); +#endif typedef void nick_func_t(struct UserNode *user, char *new_nick); -int bind_nick(nick_func_t *func); -void unbind_nick(nick_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_nick(nick_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_nick(nick_func_t *func); int event_nick(struct UserNode *user, char *new_nick); +#endif typedef void part_func_t(struct ChanUser *chanuser, char *reason); -int bind_part(part_func_t *func); -void unbind_part(part_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_part(part_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_part(part_func_t *func); int event_part(struct ChanUser *chanuser, char *reason); +#endif typedef void quit_func_t(struct UserNode *user, char *reason); -int bind_quit(quit_func_t *func); -void unbind_quit(quit_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_quit(quit_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_quit(quit_func_t *func); int event_quit(struct UserNode *user, char *reason); +#endif typedef void kick_func_t(struct UserNode *user, struct ChanUser *target, char *reason); -int bind_kick(kick_func_t *func); -void unbind_kick(kick_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_kick(kick_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_kick(kick_func_t *func); int event_kick(struct UserNode *user, struct ChanUser *target, char *reason); +#endif typedef void topic_func_t(struct UserNode *user, struct ChanNode *chan, const char *new_topic); -int bind_topic(topic_func_t *func); -void unbind_topic(topic_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_topic(topic_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_topic(topic_func_t *func); int event_topic(struct UserNode *user, struct ChanNode *chan, const char *new_topic); +#endif typedef void mode_func_t(struct UserNode *user, struct ChanNode *chan, char *modes, char **argv, int argc); -int bind_mode(mode_func_t *func); -void unbind_mode(mode_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_mode(mode_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_mode(mode_func_t *func); int event_mode(struct UserNode *user, struct ChanNode *chan, char *modes, char **argv, int argc); +#endif typedef void chanmsg_func_t(struct UserNode *user, struct ChanNode *chan, char *message); -int bind_chanmsg(chanmsg_func_t *func); -void unbind_chanmsg(chanmsg_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_chanmsg(chanmsg_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_chanmsg(chanmsg_func_t *func); int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message); +#endif typedef void privmsg_func_t(struct UserNode *user, struct UserNode *target, char *message); -int bind_privmsg(privmsg_func_t *func); -void unbind_privmsg(privmsg_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_privmsg(privmsg_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_privmsg(privmsg_func_t *func); int event_privmsg(struct UserNode *user, struct UserNode *target, char *message); +#endif typedef void channotice_func_t(struct UserNode *user, struct ChanNode *chan, char *message); -int bind_channotice(channotice_func_t *func); -void unbind_channotice(channotice_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_channotice(channotice_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_channotice(channotice_func_t *func); int event_channotice(struct UserNode *user, struct ChanNode *chan, char *message); +#endif typedef void privnotice_func_t(struct UserNode *user, struct UserNode *target, char *message); -int bind_privnotice(privnotice_func_t *func); -void unbind_privnotice(privnotice_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_privnotice(privnotice_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_privnotice(privnotice_func_t *func); int event_privnotice(struct UserNode *user, struct UserNode *target, char *message); +#endif typedef void chanctcp_func_t(struct UserNode *user, struct ChanNode *chan, char *command, char *text); -int bind_chanctcp(chanctcp_func_t *func); -void unbind_chanctcp(chanctcp_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_chanctcp(chanctcp_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_chanctcp(chanctcp_func_t *func); int event_chanctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text); +#endif typedef void privctcp_func_t(struct UserNode *user, struct UserNode *target, char *command, char *text); -int bind_privctcp(privctcp_func_t *func); -void unbind_privctcp(privctcp_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_privctcp(privctcp_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_privctcp(privctcp_func_t *func); int event_privctcp(struct UserNode *user, struct UserNode *target, char *command, char *text); +#endif typedef void invite_func_t(struct ClientSocket *client, struct UserNode *user, char *channel); -int bind_invite(invite_func_t *func); -void unbind_invite(invite_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_invite(invite_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_invite(invite_func_t *func); int event_invite(struct ClientSocket *client, struct UserNode *user, char *channel); +#endif typedef void raw_func_t(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc); -int bind_raw(raw_func_t *func); -void unbind_raw(raw_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_raw(raw_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_raw(raw_func_t *func); int event_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc); +#endif typedef void bot_ready_func_t(struct ClientSocket *client); -int bind_bot_ready(bot_ready_func_t *func); -void unbind_bot_ready(bot_ready_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_bot_ready(bot_ready_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_bot_ready(bot_ready_func_t *func); int event_bot_ready(struct ClientSocket *client); +#endif typedef int registered_func_t(struct UserNode *old_user, struct UserNode *new_user); -int bind_registered(registered_func_t *func); -void unbind_registered(registered_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_registered(registered_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_registered(registered_func_t *func); int event_registered(struct UserNode *old_user, struct UserNode *new_user); +#endif typedef int freeuser_func_t(struct UserNode *user); -int bind_freeuser(freeuser_func_t *func); -void unbind_freeuser(freeuser_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_freeuser(freeuser_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_freeuser(freeuser_func_t *func); int event_freeuser(struct UserNode *user); +#endif typedef int freechan_func_t(struct ChanNode *chan); -int bind_freechan(freechan_func_t *func); -void unbind_freechan(freechan_func_t *func); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int bind_freechan(freechan_func_t *func, int module_id); +/* MODULAR ACCESSIBLE */ void unbind_freechan(freechan_func_t *func); int event_freechan(struct ChanNode *chan); +#endif -#endif \ No newline at end of file +#endif diff --git a/src/IRCParser.h b/src/IRCParser.h index 7731cb7..cdf2714 100644 --- a/src/IRCParser.h +++ b/src/IRCParser.h @@ -31,6 +31,7 @@ struct irc_cmd { struct irc_cmd *next; }; +#ifndef DND_FUNCTIONS extern int statistics_privmsg; extern int statistics_network_users; extern int statistics_network_channels; @@ -39,8 +40,8 @@ int parse_lines(struct ClientSocket *client, char *lines, int len); void bot_disconnect(struct ClientSocket *client); void init_parser(); void free_parser(); -void reply(struct ClientSocket *client, struct UserNode *user, const char *text, ...); -char* merge_argv(char **argv, int start, int end); -char* merge_argv_char(char **argv, int start, int end, char seperator); - -#endif \ No newline at end of file +/* MODULAR ACCESSIBLE */ void reply(struct ClientSocket *client, struct UserNode *user, const char *text, ...); +/* MODULAR ACCESSIBLE */ char* merge_argv(char **argv, int start, int end); +/* MODULAR ACCESSIBLE */ char* merge_argv_char(char **argv, int start, int end, char seperator); +#endif +#endif diff --git a/src/ModeNode.h b/src/ModeNode.h index 29121c0..07f0257 100644 --- a/src/ModeNode.h +++ b/src/ModeNode.h @@ -44,19 +44,18 @@ struct ModeNode { int *mode_int_args; }; -extern unsigned int valid_modes[]; - +#ifndef DND_FUNCTIONS void init_ModeNode(); -struct ModeNode *createModeNode(struct ChanNode *chan); -void freeModeNode(struct ModeNode *modes); -int isModeSet(struct ModeNode* modes, char modeChar); -int isModeAffected(struct ModeNode* modes, char modeChar); -void* getModeValue(struct ModeNode* modes, char modeChar); -unsigned int getModeType(struct ModeNode* modes, char modeChar); -void parseModes(struct ModeNode* modes, char *modeStr, char **argv, int argc); -void parseModeString(struct ModeNode* modes, char *modeStr); -int parseMode(struct ModeNode* modes, int add, char mode, char *param); -void getModeString(struct ModeNode* modes, char *modesStr); -void getFullModeString(struct ModeNode* modes, char *modesStr); - -#endif \ No newline at end of file +/* MODULAR ACCESSIBLE */ struct ModeNode *createModeNode(struct ChanNode *chan); +/* MODULAR ACCESSIBLE */ void freeModeNode(struct ModeNode *modes); +/* MODULAR ACCESSIBLE */ int isModeSet(struct ModeNode* modes, char modeChar); +/* MODULAR ACCESSIBLE */ int isModeAffected(struct ModeNode* modes, char modeChar); +/* MODULAR ACCESSIBLE */ void* getModeValue(struct ModeNode* modes, char modeChar); +/* MODULAR ACCESSIBLE */ unsigned int getModeType(struct ModeNode* modes, char modeChar); +/* MODULAR ACCESSIBLE */ void parseModes(struct ModeNode* modes, char *modeStr, char **argv, int argc); +/* MODULAR ACCESSIBLE */ void parseModeString(struct ModeNode* modes, char *modeStr); +/* MODULAR ACCESSIBLE */ int parseMode(struct ModeNode* modes, int add, char mode, char *param); +/* MODULAR ACCESSIBLE */ void getModeString(struct ModeNode* modes, char *modesStr); +/* MODULAR ACCESSIBLE */ void getFullModeString(struct ModeNode* modes, char *modesStr); +#endif +#endif diff --git a/src/UserNode.h b/src/UserNode.h index bf07e7e..fb1afc1 100644 --- a/src/UserNode.h +++ b/src/UserNode.h @@ -59,17 +59,18 @@ struct UserNode { #define isNetworkService(USER) (USER->flags & (USERFLAG_ISBOT | USERFLAG_ISIRCOP | USERFLAG_ISSERVER)) #define isBot(USER) (USER->flags & (USERFLAG_ISBOT)) +#ifndef DND_FUNCTIONS void init_UserNode(); void free_UserNode(); -int is_valid_nick(const char *nick); -struct UserNode* getUserByNick(const char *nick); -struct UserNode* getUserByMask(const char *mask); -int countUsersWithHost(char *host); -char *getAuthFakehost(char *auth); -struct UserNode* searchUserByNick(const char *nick); -struct UserNode* getAllUsers(struct UserNode *last); -struct UserNode* getUsersWithAuth(const char *auth, struct UserNode *last); -int getUserCount(); +/* MODULAR ACCESSIBLE */ int is_valid_nick(const char *nick); +/* MODULAR ACCESSIBLE */ struct UserNode* getUserByNick(const char *nick); +/* MODULAR ACCESSIBLE */ struct UserNode* getUserByMask(const char *mask); +/* MODULAR ACCESSIBLE */ int countUsersWithHost(char *host); +/* MODULAR ACCESSIBLE */ char *getAuthFakehost(char *auth); +/* MODULAR ACCESSIBLE */ struct UserNode* searchUserByNick(const char *nick); +/* MODULAR ACCESSIBLE */ struct UserNode* getAllUsers(struct UserNode *last); +/* MODULAR ACCESSIBLE */ struct UserNode* getUsersWithAuth(const char *auth, struct UserNode *last); +/* MODULAR ACCESSIBLE */ int getUserCount(); struct UserNode* addUser(const char *nick); struct UserNode* addUserMask(const char *mask); struct UserNode* createTempUser(const char *nick); @@ -77,5 +78,5 @@ struct UserNode* createTempUserMask(const char *mask); int renameUser(struct UserNode* user, const char *new_nick); void delUser(struct UserNode* user, int freeUser); void clearTempUsers(); - +#endif #endif diff --git a/src/WHOHandler.c b/src/WHOHandler.c index 2854718..743896e 100644 --- a/src/WHOHandler.c +++ b/src/WHOHandler.c @@ -22,6 +22,7 @@ #include "ModeNode.h" #include "ClientSocket.h" #include "IPNode.h" +#include "modules.h" #define WHOQUEUETYPE_ISONQUEUE 0x01 #define WHOQUEUETYPE_USERLIST 0x02 @@ -38,6 +39,7 @@ struct WHOQueueEntry { struct UserNode *user; struct WHOQueueEntry *next; void *callback[MAXCALLBACKS]; + int module_id[MAXCALLBACKS]; void *data[MAXCALLBACKS]; }; @@ -114,7 +116,7 @@ void clear_whoqueue(struct ClientSocket *client) { DESYNCHRONIZE(whohandler_sync); } -void get_userlist(struct ChanNode *chan, userlist_callback_t callback, void *data) { +void get_userlist(struct ChanNode *chan, int module_id, userlist_callback_t callback, void *data) { struct ClientSocket *bot; for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { if(isUserOnChan(bot->user, chan)) @@ -137,6 +139,7 @@ void get_userlist(struct ChanNode *chan, userlist_callback_t callback, void *dat entry->type = WHOQUEUETYPE_ISONQUEUE | WHOQUEUETYPE_USERLIST; entry->chan = chan; entry->callback[0] = callback; + entry->module_id[0] = module_id; int i; for(i = 1; i < MAXCALLBACKS; i++) entry->callback[i] = NULL; @@ -148,7 +151,7 @@ void get_userlist(struct ChanNode *chan, userlist_callback_t callback, void *dat callback(bot, chan, data); } -void _get_userlist_with_invisible(struct ChanNode *chan, userlist_callback_t callback, void *data, int force) { +void _get_userlist_with_invisible(struct ChanNode *chan, int module_id, userlist_callback_t callback, void *data, int force) { struct ClientSocket *bot; for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { if(isUserOnChan(bot->user, chan)) @@ -172,6 +175,7 @@ void _get_userlist_with_invisible(struct ChanNode *chan, userlist_callback_t cal entry->type = WHOQUEUETYPE_ISONQUEUE | WHOQUEUETYPE_USERLIST; entry->chan = chan; entry->callback[0] = callback; + entry->module_id[0] = module_id; int i; for(i = 1; i < MAXCALLBACKS; i++) entry->callback[i] = NULL; @@ -183,7 +187,7 @@ void _get_userlist_with_invisible(struct ChanNode *chan, userlist_callback_t cal callback(bot, chan, data); } -void get_userauth(struct UserNode *user, userauth_callback_t callback, void *data) { +void get_userauth(struct UserNode *user, int module_id, userauth_callback_t callback, void *data) { //check if we have already an active WHO for this user struct ClientSocket *bot, *whobot = NULL; struct WHOQueueEntry *entry; @@ -194,6 +198,7 @@ void get_userauth(struct UserNode *user, userauth_callback_t callback, void *dat for(i = 1; i < MAXCALLBACKS; i++) { if(!entry->callback[i]) { entry->callback[i] = callback; + entry->module_id[i] = module_id; entry->data[i] = data; return; } @@ -219,6 +224,7 @@ void get_userauth(struct UserNode *user, userauth_callback_t callback, void *dat entry->user = user; user->flags |= USERFLAG_IS_ON_WHO_QUEUE; entry->callback[0] = callback; + entry->module_id[0] = module_id; int i; for(i = 1; i < MAXCALLBACKS; i++) entry->callback[i] = NULL; @@ -319,7 +325,8 @@ static void _recv_whohandler_354(struct ClientSocket *client, char **argv, unsig for(i = 0; i < MAXCALLBACKS; i++) { userauth_callback_t *callback = entry->callback[i]; if(!callback) break; - callback(client, entry->user->nick, entry->user, entry->data[i]); + if(!entry->module_id[i] || module_loaded(entry->module_id[i])) + callback(client, entry->user->nick, entry->user, entry->data[i]); } } } @@ -352,7 +359,8 @@ static void _recv_whohandler_315(struct ClientSocket *client, char **argv, unsig for(i = 0; i < MAXCALLBACKS; i++) { callback = entry->callback[i]; if(!callback) break; - callback(client, entry->chan, entry->data[i]); + if(!entry->module_id[i] || module_loaded(entry->module_id[i])) + callback(client, entry->chan, entry->data[i]); } if(entry->chan->flags & CHANFLAG_HAVE_INVISIBLES) { //remove all invisible users again @@ -371,7 +379,8 @@ static void _recv_whohandler_315(struct ClientSocket *client, char **argv, unsig for(i = 0; i < MAXCALLBACKS; i++) { callback = entry->callback[i]; if(!callback) break; - callback(client, entry->user->nick, NULL, entry->data[i]); + if(!entry->module_id[i] || module_loaded(entry->module_id[i])) + callback(client, entry->user->nick, NULL, entry->data[i]); } } entry->user->flags &= ~USERFLAG_IS_ON_WHO_QUEUE; diff --git a/src/WHOHandler.h b/src/WHOHandler.h index 68ad205..76b279b 100644 --- a/src/WHOHandler.h +++ b/src/WHOHandler.h @@ -29,14 +29,16 @@ typedef USERLIST_CALLBACK(userlist_callback_t); #define USERAUTH_CALLBACK(NAME) void NAME(UNUSED_ARG(struct ClientSocket *client), UNUSED_ARG(char *user_nick), UNUSED_ARG(struct UserNode *user), UNUSED_ARG(void *data)) typedef USERAUTH_CALLBACK(userauth_callback_t); +#define get_userlist_if_invisible(CHAN, MODID, CALLBACK, DATA) _get_userlist_with_invisible(CHAN, MODID, CALLBACK, DATA, 0) +#define get_userlist_with_invisible(CHAN, MODID, CALLBACK, DATA) _get_userlist_with_invisible(CHAN, MODID, CALLBACK, DATA, 1) + +#ifndef DND_FUNCTIONS void clear_whoqueue(struct ClientSocket *client); void recv_whohandler_354(struct ClientSocket *client, char **argv, unsigned int argc); void recv_whohandler_315(struct ClientSocket *client, char **argv, unsigned int argc); -void get_userlist(struct ChanNode *chan, userlist_callback_t callback, void *data); -#define get_userlist_if_invisible(CHAN, CALLBACK, DATA) _get_userlist_with_invisible(CHAN, CALLBACK, DATA, 0) -#define get_userlist_with_invisible(CHAN, CALLBACK, DATA) _get_userlist_with_invisible(CHAN, CALLBACK, DATA, 1) -void _get_userlist_with_invisible(struct ChanNode *chan, userlist_callback_t callback, void *data, int force); -void get_userauth(struct UserNode *user, userauth_callback_t callback, void *data); +/* MODULAR ACCESSIBLE */ void get_userlist(struct ChanNode *chan, int module_id, userlist_callback_t callback, void *data); +/* MODULAR ACCESSIBLE */ void _get_userlist_with_invisible(struct ChanNode *chan, int module_id, userlist_callback_t callback, void *data, int force); +/* MODULAR ACCESSIBLE */ void get_userauth(struct UserNode *user, int module_id, userauth_callback_t callback, void *data); void free_whoqueue(); - -#endif \ No newline at end of file +#endif +#endif diff --git a/src/bots.c b/src/bots.c index c9b0616..994dbba 100644 --- a/src/bots.c +++ b/src/bots.c @@ -98,11 +98,6 @@ static void zero_bots_trigger_callback(int clientid, struct ChanNode *chan, char } void init_bots() { - init_NeonServ(); - init_NeonSpam(); - init_DummyServ(); - init_NeonHelp(); - set_bot_alias(0, "0"); start_zero_bots(); set_trigger_callback(0, zero_bots_trigger_callback); @@ -124,20 +119,6 @@ void init_bots() { } } -void loop_bots() { - loop_NeonServ(); - loop_NeonSpam(); - loop_DummyServ(); - loop_NeonHelp(); -} - -void free_bots() { - free_NeonServ(); - free_NeonSpam(); - free_DummyServ(); - free_NeonHelp(); -} - struct ClientSocket *getChannelBot(struct ChanNode *chan, int botid) { struct ClientSocket *bot, *use_bot = NULL, *second_bot = NULL, *third_bot = NULL; struct ChanUser *chanuser; diff --git a/src/bots.h b/src/bots.h index 578f509..3344d38 100644 --- a/src/bots.h +++ b/src/bots.h @@ -24,16 +24,15 @@ struct UserNode; struct ChanNode; struct ClientSocket; +#ifndef DND_FUNCTIONS void init_bots(); -void loop_bots(); -void free_bots(); - -struct ClientSocket *getChannelBot(struct ChanNode *chan, int botid); -void requestOp(struct UserNode *user, struct ChanNode *chan); -TIMEQ_CALLBACK(channel_ban_timeout); -void general_event_privctcp(struct UserNode *user, struct UserNode *target, char *command, char *text); -void set_bot_alias(int botid, char *alias); -const char *resolve_botid(int botid); -int resolve_botalias(const char *alias); +/* MODULAR ACCESSIBLE */ struct ClientSocket *getChannelBot(struct ChanNode *chan, int botid); +/* MODULAR ACCESSIBLE */ void requestOp(struct UserNode *user, struct ChanNode *chan); +/* MODULAR ACCESSIBLE */ TIMEQ_CALLBACK(channel_ban_timeout); +/* MODULAR ACCESSIBLE */ void general_event_privctcp(struct UserNode *user, struct UserNode *target, char *command, char *text); +/* MODULAR ACCESSIBLE */ void set_bot_alias(int botid, char *alias); +/* MODULAR ACCESSIBLE */ const char *resolve_botid(int botid); +/* MODULAR ACCESSIBLE */ int resolve_botalias(const char *alias); +#endif #endif \ No newline at end of file diff --git a/src/commands.h b/src/commands.h deleted file mode 100644 index 1c92d55..0000000 --- a/src/commands.h +++ /dev/null @@ -1,23 +0,0 @@ -/* commands.h - NeonServ v5.3 - * Copyright (C) 2011-2012 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/lang.c b/src/lang.c index 1c0a027..b56322c 100644 --- a/src/lang.c +++ b/src/lang.c @@ -135,13 +135,18 @@ void register_default_language_table(const struct default_language_entry *msgtab void register_language_string(struct language *lang, char *ident, char *text) { int cindex = get_entry_index(ident); - struct language_table *lang_entry = malloc(sizeof(*lang_entry)); - if (!lang_entry) { - perror("malloc() failed"); - return; + struct language_table *lang_entry; + for(lang_entry = lang->entrys[cindex]; lang_entry; lang_entry = lang_entry->next) { + if(!strcmp(lang_entry->ident, ident)) break; + } + if(!lang_entry) { + lang_entry = malloc(sizeof(*lang_entry)); + if (!lang_entry) { + perror("malloc() failed"); + return; + } + lang_entry->ident = strdup(ident); } - - lang_entry->ident = strdup(ident); //replace all: //$b to \002 //$k to \003 diff --git a/src/lang.h b/src/lang.h index 162d6ae..2115050 100644 --- a/src/lang.h +++ b/src/lang.h @@ -39,16 +39,17 @@ struct language { struct language_table **entrys; }; +#ifndef DND_FUNCTIONS void init_lang(); void free_lang(); -struct language* get_language_by_tag(char *tag); -struct language* get_language_by_name(char *name); -struct language* get_default_language(); +/* MODULAR ACCESSIBLE */ struct language* get_language_by_tag(char *tag); +/* MODULAR ACCESSIBLE */ struct language* get_language_by_name(char *name); +/* MODULAR ACCESSIBLE */ struct language* get_default_language(); void load_languages(); -void load_language(char *tag, char *name); +/* MODULAR ACCESSIBLE */ void load_language(char *tag, char *name); void register_language_string(struct language *lang, char *ident, char *text); -void register_default_language_table(const struct default_language_entry *msgtab); -char *get_language_string(struct UserNode *user, const char* msg_ident); -char *build_language_string(struct UserNode *user, char *buffer, const char *msg_ident, ...); - -#endif \ No newline at end of file +/* MODULAR ACCESSIBLE */ void register_default_language_table(const struct default_language_entry *msgtab); +/* MODULAR ACCESSIBLE */ char *get_language_string(struct UserNode *user, const char* msg_ident); +/* MODULAR ACCESSIBLE */ char *build_language_string(struct UserNode *user, char *buffer, const char *msg_ident, ...); +#endif +#endif diff --git a/src/main.c b/src/main.c index 79043b1..0ca3d31 100644 --- a/src/main.c +++ b/src/main.c @@ -61,6 +61,7 @@ static pthread_mutex_t log_sync; static void check_firstrun(); void cleanup() { + stop_modules(); free_sockets(); qserver_free(); free_parser(); @@ -69,7 +70,6 @@ void cleanup() { free_bind(); free_modcmd(); free_whoqueue(); - free_bots(); free_mysql(); free_handleinfohandler(); free_lang(); @@ -282,7 +282,7 @@ main: init_modcmd(); init_handleinfohandler(); init_tools(); - register_commands(); + init_bots(); init_DBHelper(); qserver_init(); @@ -290,9 +290,9 @@ main: load_languages(); int update_minutes = get_int_field("statistics.frequency"); if(!update_minutes) update_minutes = 2; - timeq_add(update_minutes * 60 + 10, main_statistics, NULL); + timeq_add(update_minutes * 60 + 10, 0, main_statistics, NULL); - timeq_add(90, main_checkauths, NULL); + timeq_add(90, 0, main_checkauths, NULL); int worker_threads = get_int_field("General.worker_threads"); if(!worker_threads) worker_threads = 1; @@ -307,7 +307,7 @@ main: int usleep_delay = 1000000 / TICKS_PER_SECOND; while(running) { timeq_tick(); - loop_bots(); + loop_modules(); qserver_loop(); queue_loop(); mysql_free(); @@ -329,7 +329,7 @@ main: } } while(time(0) < socket_wait); timeq_tick(); - loop_bots(); + loop_modules(); clearTempUsers(); destroyEvents(); qserver_loop(); @@ -472,13 +472,13 @@ TIMEQ_CALLBACK(main_checkauths) { } } - timeq_add(next_call, main_checkauths, NULL); + timeq_add(next_call, 0, main_checkauths, NULL); } TIMEQ_CALLBACK(main_statistics) { int update_minutes = get_int_field("statistics.frequency"); if(!update_minutes) update_minutes = 2; - timeq_add(update_minutes * 60, main_statistics, NULL); + timeq_add(update_minutes * 60, 0, main_statistics, NULL); if(get_int_field("statistics.enable")) { statistics_enabled = 1; statistics_requested_lusers = 1; @@ -518,6 +518,14 @@ void statistics_update() { } } +time_t getStartTime() { + return start_time; +} + +int getRunningThreads() { + return running_threads; +} + void write_log(int loglevel, const char *line, int len) { SYNCHRONIZE(log_sync); if(!daemonized && (print_loglevel & loglevel)) { diff --git a/src/main.h b/src/main.h index eb39d49..f143031 100644 --- a/src/main.h +++ b/src/main.h @@ -16,139 +16,9 @@ */ #ifndef _main_h #define _main_h -#include "../config.h" - -#define NEONSERV_VERSION "5.3" -#define VERSION_PATCHLEVEL 543 - -#include -#include -#include -#include -#ifdef WIN32 -#include -#include -#include -#else -#include -#include -#include -#include -#include -#include -#include -#include -#endif -#include -#include -#include -#include -#include -#ifdef HAVE_THREADS -#include -#ifdef WIN32 -#define pthread_self_tid() pthread_self().p -#else -#define pthread_self_tid() pthread_self() -#endif -#define THREAD_MUTEX_INIT(var) { \ - pthread_mutexattr_t mutex_attr; \ - pthread_mutexattr_init(&mutex_attr);\ - pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE_NP);\ - pthread_mutex_init(&var, &mutex_attr); \ -} -#define THREAD_MUTEX_INIT_TYPE(var, type) { \ - pthread_mutexattr_t mutex_attr; \ - pthread_mutexattr_init(&mutex_attr);\ - pthread_mutexattr_settype(&mutex_attr, type);\ - pthread_mutex_init(&var, &mutex_attr); \ -} -#define SYNCHRONIZE(var) pthread_mutex_lock(&var) -#define SET_SYNCHRONIZE(var) pthread_mutex_trylock(&var) -#define DESYNCHRONIZE(var) pthread_mutex_unlock(&var) -#else -#define THREAD_MUTEX_INIT(var) -#define SYNCHRONIZE(var) -#define DESYNCHRONIZE(var) -#endif - -#if __GNUC__ -#define PRINTF_LIKE(M,N) __attribute__((format (printf, M, N))) -#else -#define PRINTF_LIKE(M,N) -#endif - -#if __GNUC__ >= 2 -#define UNUSED_ARG(ARG) ARG __attribute__((unused)) -#elif defined(S_SPLINT_S) -#define UNUSED_ARG(ARG) /*@unused@*/ ARG -#define const /*@observer@*/ /*@temp@*/ -#else -#define UNUSED_ARG(ARG) ARG -#endif - -#define STRINGIFY_(x) #x -#define STRINGIFY(x) STRINGIFY_(x) - -#if defined(__GNUC__) -#if defined(__GNUC_PATCHLEVEL__) -#define COMPILER "GCC" " " STRINGIFY(__GNUC__) "." STRINGIFY(__GNUC_MINOR__) "." STRINGIFY(__GNUC_PATCHLEVEL__) -#else -#define COMPILER "GCC" " " STRINGIFY(__GNUC__) "." STRINGIFY(__GNUC_MINOR__) -#endif -#elif defined (__IMAGECRAFT__) -#define COMPILER "ICCAVR" -#else -#define COMPILER "Unknown" -#endif - -#ifdef ENABLE_MEMORY_DEBUG -#include "memoryDebug.h" -#endif - -#define PID_FILE "neonserv.pid" -#define CONF_FILE "neonserv.conf" -#define LOG_FILE "neonserv.log" - -#define SOCKET_SELECT_TIME 1 -#define SOCKET_RECONNECT_TIME 20 - -#define NICKLEN 30 -#define USERLEN 10 -#define AUTHLEN 32 -#define HOSTLEN 63 -#define REALLEN 50 -#define TOPICLEN 500 -#define CHANNELLEN 200 -#define MAXLEN 512 -#define MAXLOGLEN 1024 -#define TRIGGERLEN 50 -#define MAXNUMPARAMS 200 /* maximum number of parameters in one line */ -#define MAXLANGUAGES 5 -#define MAXMODES 6 -#define INVITE_TIMEOUT 30 -#define BOTWAR_DETECTION_TIME 7 -#define BOTWAR_DETECTION_EVENTS 6 -#define REWHO_TIMEOUT 10 /* wait 10 seconds before WHO an unauthed user again */ -#define TICKS_PER_SECOND 10 - -//valid nick chars -#define VALID_NICK_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890{|}~[\\]^-_`" -//the first char is a little bit different -// 0 1 2 3 4 5 6 -// 1234567890123456789012345678901234567890123456789012345678 9012 62 -#define VALID_NICK_CHARS_FIRST "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~[\\]^_`" -#define VALID_NICK_CHARS_FIRST_LEN 62 - -#define TEMPUSER_LIST_INDEX VALID_NICK_CHARS_FIRST_LEN - -#define LOGLEVEL_INFO 0x01 -#define LOGLEVEL_ERROR 0x02 -#define LOGLEVEL_RAW 0x04 -#define LOGLEVEL_MYSQL 0x08 - -#define timeval_is_bigger(x,y) ((x.tv_sec > y.tv_sec) || (x.tv_sec == y.tv_sec && x.tv_usec > y.tv_usec)) +#include "overall.h" +#ifndef DND_FUNCTIONS extern time_t start_time; extern int statistics_enabled; #ifdef HAVE_THREADS @@ -156,24 +26,25 @@ extern int running_threads; extern pthread_mutex_t cache_sync; extern pthread_mutex_t whohandler_sync, whohandler_mass_sync; -int getCurrentThreadID(); +/* MODULAR ACCESSIBLE */ int getCurrentThreadID(); #endif +/* MODULAR ACCESSIBLE */ time_t getStartTime(); +/* MODULAR ACCESSIBLE */ int getRunningThreads(); + void exit_daemon(); -int stricmp (const char *s1, const char *s2); -int stricmplen (const char *s1, const char *s2, int len); +/* MODULAR ACCESSIBLE */ int stricmp (const char *s1, const char *s2); +/* MODULAR ACCESSIBLE */ int stricmplen (const char *s1, const char *s2, int len); -void restart_process(); -void cleanup(); -void restart_bot(int do_hard_restart); -void stop_bot(); -void reload_config(); +/* MODULAR ACCESSIBLE */ void restart_process(); +/* MODULAR ACCESSIBLE */ void cleanup(); +/* MODULAR ACCESSIBLE */ void restart_bot(int do_hard_restart); +/* MODULAR ACCESSIBLE */ void stop_bot(); +/* MODULAR ACCESSIBLE */ void reload_config(); void statistics_update(); -void putlog(int loglevel, const char *text, ...) PRINTF_LIKE(2, 3); - -#define perror(errmsg) (putlog(LOGLEVEL_ERROR, "ERROR (%s:%d) %s", __FILE__, __LINE__, errmsg)) - +/* MODULAR ACCESSIBLE */ void putlog(int loglevel, const char *text, ...) PRINTF_LIKE(2, 3); +#endif #endif \ No newline at end of file diff --git a/src/memoryDebug.c b/src/memoryDebug.c index e870f4b..b8cb9ce 100644 --- a/src/memoryDebug.c +++ b/src/memoryDebug.c @@ -113,35 +113,6 @@ static void remove_mem_info(void *mem_ref) { DESYNCHRONIZE(synchronized); } -void report_mem_leak() { - SYNCHRONIZE(synchronized); - struct MemoryLeak *leak_info; - FILE *fp_write = fopen(OUTPUT_FILE, "wt"); - char info[1024]; - - if(fp_write != NULL) { - sprintf(info, "%s\n", "Memory Leak Summary"); - fwrite(info, (strlen(info)) , 1, fp_write); - sprintf(info, "%s\n", "-----------------------------------"); - fwrite(info, (strlen(info)) , 1, fp_write); - - for(leak_info = ptr_start; leak_info != NULL; leak_info = leak_info->next) { - sprintf(info, "address : %p\n", leak_info->mem_info.address); - fwrite(info, (strlen(info)) , 1, fp_write); - sprintf(info, "size : %d bytes\n", leak_info->mem_info.size); - fwrite(info, (strlen(info)) , 1, fp_write); - sprintf(info, "file : %s\n", leak_info->mem_info.file_name); - fwrite(info, (strlen(info)) , 1, fp_write); - sprintf(info, "line : %d\n", leak_info->mem_info.line); - fwrite(info, (strlen(info)) , 1, fp_write); - sprintf(info, "%s\n", "-----------------------------------"); - fwrite(info, (strlen(info)) , 1, fp_write); - } - } - fclose(fp_write); - DESYNCHRONIZE(synchronized); -} - void initMemoryDebug() { THREAD_MUTEX_INIT(synchronized); } diff --git a/src/memoryDebug.h b/src/memoryDebug.h index c07d494..9a3adac 100644 --- a/src/memoryDebug.h +++ b/src/memoryDebug.h @@ -22,12 +22,12 @@ #define strdup(data) xstrdup (data, __FILE__, __LINE__) #define free(mem_ref) xfree(mem_ref) -void *xmalloc(unsigned int size, const char *file, unsigned int line); -void *xcalloc(unsigned int elements, unsigned int size, const char *file, unsigned int line); -char *xstrdup(const char *data, const char *file, unsigned int line); -void xfree(void *mem_ref); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ void *xmalloc(unsigned int size, const char *file, unsigned int line); +/* MODULAR ACCESSIBLE */ void *xcalloc(unsigned int elements, unsigned int size, const char *file, unsigned int line); +/* MODULAR ACCESSIBLE */ char *xstrdup(const char *data, const char *file, unsigned int line); +/* MODULAR ACCESSIBLE */ void xfree(void *mem_ref); -void report_mem_leak(); void initMemoryDebug(); - +#endif #endif diff --git a/src/memoryInfo.h b/src/memoryInfo.h index f1cca21..f6987bf 100644 --- a/src/memoryInfo.h +++ b/src/memoryInfo.h @@ -24,9 +24,10 @@ struct memoryInfoFiles { struct memoryInfoFiles *next; }; -struct memoryInfoFiles *getMemoryInfoFiles(); -void freeMemoryInfoFiles(struct memoryInfoFiles *files); - +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ struct memoryInfoFiles *getMemoryInfoFiles(); +/* MODULAR ACCESSIBLE */ void freeMemoryInfoFiles(struct memoryInfoFiles *files); +#endif struct memoryInfoLines { unsigned int line; @@ -35,8 +36,9 @@ struct memoryInfoLines { struct memoryInfoLines *next; }; -struct memoryInfoLines *getMemoryInfoLines(const char *filename); -void freeMemoryInfoLines(struct memoryInfoLines *lines); - +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ struct memoryInfoLines *getMemoryInfoLines(const char *filename); +/* MODULAR ACCESSIBLE */ void freeMemoryInfoLines(struct memoryInfoLines *lines); +#endif #endif diff --git a/src/modcmd.c b/src/modcmd.c index 8846d90..7ba0b93 100644 --- a/src/modcmd.c +++ b/src/modcmd.c @@ -30,6 +30,7 @@ struct trigger_callback { int botid; + int module_id; trigger_callback_t *func; struct trigger_callback *next; @@ -596,7 +597,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) { +int register_command(int botid, char *name, int module_id, 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 || cmdfunc->botid == 0) && strcmp(cmdfunc->name, name) == 0) @@ -609,6 +610,7 @@ int register_command(int botid, char *name, cmd_bind_t *func, int paramcount, ch } cmdfunc->botid = botid; cmdfunc->name = strdup(name); + cmdfunc->module_id = module_id; cmdfunc->func = func; cmdfunc->flags = flags; cmdfunc->paramcount = paramcount; @@ -619,7 +621,7 @@ int register_command(int botid, char *name, cmd_bind_t *func, int paramcount, ch return 1; } -int set_trigger_callback(int botid, trigger_callback_t *func) { +int set_trigger_callback(int botid, int module_id, trigger_callback_t *func) { static struct trigger_callback *cb = NULL; for(cb = trigger_callbacks; cb; cb = cb->next) { if(cb->botid == botid) @@ -635,6 +637,7 @@ int set_trigger_callback(int botid, trigger_callback_t *func) { cb->next = trigger_callbacks; trigger_callbacks = cb; } + cb->module_id = module_id; cb->func = func; return 1; } @@ -769,13 +772,13 @@ int unbind_botwise_cmd(int botid, int clientid, char *cmd) { return 0; } -int unbind_botwise_allcmd(int clientid) { +int unbind_botwise_allcmd(int botid, int clientid) { int i; for(i = 0; i < 27; i++) { struct cmd_binding *cbind, *next, *last = NULL; for(cbind = cmd_binds[i]; cbind; cbind = next) { next = cbind->next; - if(clientid == cbind->clientid) { + if((botid == 0 && clientid == cbind->clientid) || (botid && botid == cbind->botid)) { if(last) last->next = cbind->next; else @@ -1011,3 +1014,54 @@ struct cmd_binding *getAllBinds(struct cmd_binding *last) { } while(bind_index < 27); return NULL; } + +void unregister_module_commands(int module_id) { + struct cmd_function *cmdfunct, *nextfunct, *prevfunct = NULL; + int i; + for(cmdfunct = cmd_functions; cmdfunct; cmdfunct = nextfunct) { + nextfunct = cmdfunct->next; + if(cmdfunct->module_id == module_id) { + for(i = 0; i < 27; i++) { + struct cmd_binding *cbind, *next, *last = NULL; + for(cbind = cmd_binds[i]; cbind; cbind = next) { + next = cbind->next; + if(cmdfunct == cbind->func) { + if(last) + last->next = cbind->next; + else + cmd_binds[i] = cbind->next; + free(cbind->cmd); + if(cbind->paramcount) { + int j; + for(j = 0; j < cbind->paramcount; j++) + free(cbind->parameters[j]); + } + if(cbind->channel_access) + free(cbind->channel_access); + free(cbind); + } else + last = cbind; + } + } + if(prevfunct) + prevfunct->next = nextfunct; + else + cmd_functions = nextfunct; + free(cmdfunct->name); + free(cmdfunct); + } else + prevfunct = cmdfunct; + } + static struct trigger_callback *cb, *prevcb = NULL, *nextcb; + for(cb = trigger_callbacks; cb; cb = nextcb) { + nextcb = cb->next; + if(cb->module_id == module_id) { + if(prevcb) + prevcb->next = nextcb; + else + trigger_callbacks = nextcb; + free(cb); + } else + prevcb = cb; + } +} diff --git a/src/modcmd.h b/src/modcmd.h index 7465254..0ccd7f5 100644 --- a/src/modcmd.h +++ b/src/modcmd.h @@ -49,6 +49,7 @@ typedef void trigger_callback_t(int clientid, struct ChanNode *chan, char *trigg struct cmd_function { char *name; int botid; + int module_id; cmd_bind_t *func; unsigned int flags; int paramcount; @@ -83,54 +84,49 @@ struct trigger_cache { struct trigger_cache *next; }; -extern int statistics_commands; - -void init_modcmd(); -void free_modcmd(); - #define get_prefered_bot(BOTID) get_botwise_prefered_bot(BOTID, 0) -struct ClientSocket* get_botwise_prefered_bot(int botid, int clientid); - -int register_command(int botid, char *name, cmd_bind_t *func, int paramcount, char *channel_access, int global_access, unsigned int flags); -int set_trigger_callback(int botid, trigger_callback_t *func); - -int flush_trigger_cache(int botid, int clientid); - #define changeChannelTrigger(BOTID,CHAN,NEW) changeBotwiseChannelTrigger(BOTID, 0, CHAN, NEW) -int changeBotwiseChannelTrigger(int botid, int clientid, struct ChanNode *chan, char *new_trigger); - #define bind_cmd_to_function(BOTID,CMD,FUNC) bind_botwise_cmd_to_function(BOTID, 0, CMD, FUNC) -int bind_botwise_cmd_to_function(int botid, int clientid, char *cmd, struct cmd_function *func); - #define bind_cmd_to_command(BOTID,CMD,FUNC) bind_botwise_cmd_to_command(BOTID, 0, CMD, FUNC) -int bind_botwise_cmd_to_command(int botid, int clientid, char *cmd, char *func); - #define unbind_cmd(BOTID,CMD) unbind_botwise_cmd(BOTID, 0, CMD) -int unbind_botwise_cmd(int botid, int clientid, char *cmd); - -int unbind_botwise_allcmd(int clientid); - +#define unbind_allcmd(BOTID) unbind_botwise_allcmd(BOTID, 0) #define bind_set_parameters(BOTID,CMD,PARAMETERS) bind_botwise_set_parameters(BOTID, 0, CMD, PARAMETERS) -void bind_botwise_set_parameters(int botid, int clientid, char *cmd, char *parameters); - #define bind_set_global_access(BOTID,CMD,GACCESS) bind_botwise_set_global_access(BOTID, 0, CMD, GACCESS) -void bind_botwise_set_global_access(int botid, int clientid, char *cmd, int gaccess); - #define bind_set_channel_access(BOTID,CMD,CACCESS) bind_botwise_set_channel_access(BOTID, 0, CMD, CACCESS) -void bind_botwise_set_channel_access(int botid, int clientid, char *cmd, char *chanaccess); - #define bind_set_bind_flags(BOTID,CMD,FLAGS) bind_botwise_set_bind_flags(BOTID, 0, CMD, FLAGS) -void bind_botwise_set_bind_flags(int botid, int clientid, char *cmd, unsigned int flags); - #define find_cmd_binding(BOTID,CMD) find_botwise_cmd_binding(BOTID, 0, CMD) -struct cmd_binding *find_botwise_cmd_binding(int botid, int clientid, char *cmd); - #define bind_unbound_required_functions(BOTID) bind_botwise_unbound_required_functions(BOTID, 0) -void bind_botwise_unbound_required_functions(int botid, int clientid); -struct cmd_function *find_cmd_function(int botid, char *name); -struct ClientSocket *getTextBot(); -void register_command_alias(int botid, char *alias); -struct cmd_binding *getAllBinds(struct cmd_binding *last); -#endif \ No newline at end of file +#ifndef DND_FUNCTIONS +extern int statistics_commands; + +void init_modcmd(); +void free_modcmd(); + +/* MODULAR ACCESSIBLE */ struct ClientSocket* get_botwise_prefered_bot(int botid, int clientid); + +/* MODULAR ACCESSIBLE */ int register_command(int botid, char *name, int module_id, cmd_bind_t *func, int paramcount, char *channel_access, int global_access, unsigned int flags); +/* MODULAR ACCESSIBLE */ int set_trigger_callback(int botid, int module_id, trigger_callback_t *func); + +/* MODULAR ACCESSIBLE */ int flush_trigger_cache(int botid, int clientid); +/* MODULAR ACCESSIBLE */ int changeBotwiseChannelTrigger(int botid, int clientid, struct ChanNode *chan, char *new_trigger); +/* MODULAR ACCESSIBLE */ int bind_botwise_cmd_to_function(int botid, int clientid, char *cmd, struct cmd_function *func); +/* MODULAR ACCESSIBLE */ int bind_botwise_cmd_to_command(int botid, int clientid, char *cmd, char *func); +/* MODULAR ACCESSIBLE */ int unbind_botwise_cmd(int botid, int clientid, char *cmd); +/* MODULAR ACCESSIBLE */ int unbind_botwise_allcmd(int botid, int clientid); +/* MODULAR ACCESSIBLE */ void bind_botwise_set_parameters(int botid, int clientid, char *cmd, char *parameters); +/* MODULAR ACCESSIBLE */ void bind_botwise_set_global_access(int botid, int clientid, char *cmd, int gaccess); +/* MODULAR ACCESSIBLE */ void bind_botwise_set_channel_access(int botid, int clientid, char *cmd, char *chanaccess); +/* MODULAR ACCESSIBLE */ void bind_botwise_set_bind_flags(int botid, int clientid, char *cmd, unsigned int flags); +/* MODULAR ACCESSIBLE */ struct cmd_binding *find_botwise_cmd_binding(int botid, int clientid, char *cmd); +/* MODULAR ACCESSIBLE */ void bind_botwise_unbound_required_functions(int botid, int clientid); +/* MODULAR ACCESSIBLE */ struct cmd_function *find_cmd_function(int botid, char *name); +/* MODULAR ACCESSIBLE */ struct ClientSocket *getTextBot(); +/* MODULAR ACCESSIBLE */ void register_command_alias(int botid, char *alias); +/* MODULAR ACCESSIBLE */ struct cmd_binding *getAllBinds(struct cmd_binding *last); + +void unregister_module_commands(int module_id); + +#endif +#endif diff --git a/src/modules.c b/src/modules.c new file mode 100644 index 0000000..0c2034e --- /dev/null +++ b/src/modules.c @@ -0,0 +1,407 @@ +/* modules.c - NeonServ v5.3 + * Copyright (C) 2011-2012 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 "modules.h" + +/* 000-011 */ #include "main.h" +/* 012 */ #include "BanNode.h" +/* 013-019 */ #include "bots.h" +/* 020-025 */ #include "ChanNode.h" +/* 026-029 */ #include "ChanUser.h" +/* 030-036 */ #include "ClientSocket.h" +/* 037-038 */ #include "ConfigParser.h" +/* 039-048 */ #include "DBHelper.h" +/* 049 */ #include "EventLogger.h" +/* 050 */ #include "HandleInfoHandler.h" +/* 051-088 */ #include "IRCEvents.h" +/* 089-091 */ #include "IRCParser.h" +/* 092-098 */ #include "lang.h" +#ifdef ENABLE_MEMORY_DEBUG +/* 099-102 */ #include "memoryDebug.h" +#endif +/* 103-106 */ #include "memoryInfo.h" +/* 107-125 */ #include "modcmd.h" +/* 126-136 */ #include "ModeNode.h" +/* 137-142 */ #include "mysqlConn.h" +/* 143-149 */ #include "timeq.h" +/* 150-169 */ #include "tools.h" +/* 170-178 */ #include "UserNode.h" +/* 179 */ #include "version.h" +/* 180-182 */ #include "WHOHandler.h" + +void **global_functions = { +/* 000 */ getStartTime, +/* 001 */ getRunningThreads, +/* 002 */ exit_daemon, +/* 003 */ stricmp, +/* 004 */ stricmplen, +/* 005 */ restart_process, +/* 006 */ cleanup, +/* 007 */ restart_bot, +/* 008 */ stop_bot, +/* 009 */ reload_config, +/* 010 */ putlog, +#ifdef HAVE_THREADS +/* 011 */ getCurrentThreadID, +#else +/* 011 */ NULL, +#endif +/* 012 */ getMatchingChannelBan, +/* 013 */ getChannelBot, +/* 014 */ requestOp, +/* 015 */ channel_ban_timeout, +/* 016 */ general_event_privctcp, +/* 017 */ set_bot_alias, +/* 018 */ resolve_botid, +/* 019 */ resolve_botalias, +/* 020 */ is_valid_chan, +/* 021 */ getAllChans, +/* 022 */ getChanByName, +/* 023 */ getChannelCount, +/* 024 */ getChanUserCount, +/* 025 */ getChanBanCount, +/* 026 */ isUserOnChan, +/* 027 */ getChanUser, +/* 028 */ getChannelUsers, +/* 029 */ getUserChannels, +/* 030 */ create_socket, +/* 031 */ connect_socket, +/* 032 */ close_socket, +/* 033 */ disconnect_socket, +/* 034 */ write_socket, +/* 035 */ putsock, +/* 036 */ getBots, +/* 037 */ get_int_field, +/* 038 */ get_string_field, +/* 039 */ _loadUserSettings, +/* 040 */ isGodMode, +/* 041 */ getChanDefault, +/* 042 */ getChannelAccess, +/* 043 */ checkChannelAccess, +/* 044 */ _loadChannelSettings, +/* 045 */ isUserProtected, +/* 046 */ getBanAffectingMask, +/* 047 */ renameAccount, +/* 048 */ deleteUser, +/* 049 */ logEvent, +/* 050 */ lookup_authname, +/* 051 */ bind_join, +/* 052 */ unbind_join, +/* 053 */ bind_nick, +/* 054 */ unbind_nick, +/* 055 */ bind_part, +/* 056 */ unbind_part, +/* 057 */ bind_quit, +/* 058 */ unbind_quit, +/* 059 */ bind_kick, +/* 060 */ unbind_kick, +/* 061 */ bind_topic, +/* 062 */ unbind_topic, +/* 063 */ bind_mode, +/* 064 */ unbind_mode, +/* 065 */ bind_chanmsg, +/* 066 */ unbind_chanmsg, +/* 067 */ bind_privmsg, +/* 068 */ unbind_privmsg, +/* 069 */ bind_channotice, +/* 070 */ unbind_channotice, +/* 071 */ bind_privnotice, +/* 072 */ unbind_privnotice, +/* 073 */ bind_chanctcp, +/* 074 */ unbind_chanctcp, +/* 075 */ bind_privctcp, +/* 076 */ unbind_privctcp, +/* 077 */ bind_invite, +/* 078 */ unbind_invite, +/* 079 */ bind_raw, +/* 080 */ unbind_raw, +/* 081 */ bind_bot_ready, +/* 082 */ unbind_bot_ready, +/* 083 */ bind_registered, +/* 084 */ unbind_registered, +/* 085 */ bind_freeuser, +/* 086 */ unbind_freeuser, +/* 087 */ bind_freechan, +/* 088 */ unbind_freechan, +/* 089 */ reply, +/* 090 */ merge_argv, +/* 091 */ merge_argv_char, +/* 092 */ get_language_by_tag, +/* 093 */ get_language_by_name, +/* 094 */ get_default_language, +/* 095 */ load_language, +/* 096 */ register_default_language_table, +/* 097 */ get_language_string, +/* 098 */ build_language_string, +#ifdef ENABLE_MEMORY_DEBUG +/* 099 */ xmalloc, +/* 100 */ xcalloc, +/* 101 */ xstrdup, +/* 102 */ xfree, +#else +/* 099 */ NULL, +/* 100 */ NULL, +/* 101 */ NULL, +/* 102 */ NULL, +#endif +/* 103 */ getMemoryInfoFiles, +/* 104 */ freeMemoryInfoFiles, +/* 105 */ getMemoryInfoLines, +/* 106 */ freeMemoryInfoLines, +/* 107 */ get_botwise_prefered_bot, +/* 108 */ register_command, +/* 109 */ set_trigger_callback, +/* 110 */ flush_trigger_cache, +/* 111 */ changeBotwiseChannelTrigger, +/* 112 */ bind_botwise_cmd_to_function, +/* 113 */ bind_botwise_cmd_to_command, +/* 114 */ unbind_botwise_cmd, +/* 115 */ unbind_botwise_allcmd, +/* 116 */ bind_botwise_set_parameters, +/* 117 */ bind_botwise_set_global_access, +/* 118 */ bind_botwise_set_channel_access, +/* 119 */ bind_botwise_set_bind_flags, +/* 120 */ find_botwise_cmd_binding, +/* 121 */ bind_botwise_unbound_required_functions, +/* 122 */ find_cmd_function, +/* 123 */ getTextBot, +/* 124 */ register_command_alias, +/* 125 */ getAllBinds, +/* 126 */ createModeNode, +/* 127 */ freeModeNode, +/* 128 */ isModeSet, +/* 129 */ isModeAffected, +/* 130 */ getModeValue, +/* 131 */ getModeType, +/* 132 */ parseModes, +/* 133 */ parseModeString, +/* 134 */ parseMode, +/* 135 */ getModeString, +/* 136 */ getFullModeString, +/* 137 */ mysql_use, +/* 138 */ mysql_free, +/* 139 */ printf_mysql_query, +/* 140 */ printf_long_mysql_query, +/* 141 */ escape_string, +/* 142 */ get_mysql_conn, +/* 143 */ timeq_add, +/* 144 */ timeq_uadd, +/* 145 */ timeq_add_name, +/* 146 */ timeq_uadd_name, +/* 147 */ timeq_del, +/* 148 */ timeq_del_name, +/* 149 */ timeq_name_exists, +/* 150 */ match, +/* 151 */ table_init, +/* 152 */ table_add, +/* 153 */ table_change, +/* 154 */ table_change_field, +/* 155 */ table_set_bold, +/* 156 */ table_end, +/* 157 */ table_free, +/* 158 */ timeToStr, +/* 159 */ strToTime, +/* 160 */ initModeBuffer, +/* 161 */ modeBufferSet, +/* 162 */ flushModeBuffer, +/* 163 */ freeModeBuffer, +/* 164 */ is_ircmask, +/* 165 */ generate_banmask, +/* 166 */ make_banmask, +/* 167 */ isFakeHost, +/* 168 */ mask_match, +/* 169 */ crc32, +/* 170 */ is_valid_nick, +/* 171 */ getUserByNick, +/* 172 */ getUserByMask, +/* 173 */ countUsersWithHost, +/* 174 */ getAuthFakehost, +/* 175 */ searchUserByNick, +/* 176 */ getAllUsers, +/* 177 */ getUsersWithAuth, +/* 178 */ getUserCount, +/* 179 */ get_userlist, +/* 180 */ _get_userlist_with_invisible, +/* 181 */ get_userauth, +/* 182 */ &compilation, +/* 183 */ &creation, +/* 184 */ &revision, +/* 185 */ &codelines, +/* 186 */ &patchlevel +}; + +#define MODINFO_STATE_STARTED 0x01 + +struct ModuleInfo { + char *name; + int module_id; + #ifndef WIN32 + void *module; + #else + HMODULE module; + #endif + int state; + void *startfunc; + void *loopfunc; + void *stopfunc; + struct ModuleInfo *next; +} + +static int module_id_counter = 1; +static struct ModuleInfo *modules = NULL; + +static void unregister_module_hooks(int module_id); + +int loadModule(char *name) { + char fname[256]; + #ifndef WIN32 + sprintf(fname, "%s.so", name); + void* module = dlopen(fname, RTLD_LAZY); + if(!module) { + putlog(LOGLEVEL_ERROR, "Error loading module '%s': %s not found.", name, fname); + return 0; + } + void* initfunc = dlsym(module, "init_module"); + void* startfunc = dlsym(module, "start_module"); + void* loopfunc = dlsym(module, "loop_module"); + void* stopfunc = dlsym(module, "stop_module"); + void* modversion = dlsym(module, "modversion"); + #else + sprintf(fname, "%s.dll", name); + HMODULE module = LoadLibrary(fname); + if(!module) { + putlog(LOGLEVEL_ERROR, "Error loading module '%s': %s not found.", name, fname); + return 0; + } + FARPROC initfunc = GetProcAddress(module, "init_module"); + FARPROC startfunc = GetProcAddress(module, "start_module"); + FARPROC loopfunc = GetProcAddress(module, "loop_module"); + FARPROC stopfunc = GetProcAddress(module, "stop_module"); + FARPROC modversion = GetProcAddress(module, "modversion"); + #endif + if(!startfunc || !loopfunc || !stopfunc || !modversion) { + putlog(LOGLEVEL_ERROR, "Error loading module '%s': required symbols not found.", name); + return 0; + } + int version = ((int (*)(void)) modversion)(); + if(version != MODULE_VERSION) { + putlog(LOGLEVEL_ERROR, "Error loading module '%s': version mismatch ('%d' main code, '%d' module)", name, MODULE_VERSION, version); + return 0; + } + //start module + int errid; + int module_id = module_id_counter++; + if((errid = ((int (*)(void **, int)) initfunc)(global_functions, module_id))) { + putlog(LOGLEVEL_ERROR, "Error loading module '%s': module reported error (errid: %d)", name, errid); + return 0; + } + struct ModuleInfo *modinfo = malloc(sizeof(*modinfo)); + if(!modinfo) { + unregister_module_hooks(module_id); + return 0; + } + modinfo->name = strdup(name); + modinfo->module_id = module_id; + modinfo->module = module; + modinfo->startfunc = startfunc; + modinfo->loopfunc = loopfunc; + modinfo->stopfunc = stopfunc; + modinfo->next = modules; + modules = modinfo; + return 1; +} + +#ifndef WIN32 +static void closemodule(void *module) { + dlclose(module); +} +#else +static void closemodule(HMODULE module) { + FreeLibrary(module); +} +#endif + +int reload_module(char *name) { + struct ModuleInfo *old_modinfo, *old_prev = NULL; + for(old_modinfo = modules; old_modinfo; old_modinfo = old_modinfo->next) { + if(old_prev) + old_prev->next = old_modinfo->next; + else + modules = old_modinfo->next; + unregister_module_hooks(old_modinfo->module_id); + ((void (*)(void)) old_modinfo->stopfunc)(MODSTATE_RELOAD); + closemodule(old_modinfo->module); + free(old_modinfo->name); + free(old_modinfo); + break; + } else + old_prev = old_modinfo; + if(!loadModule(name)) return 0; + struct ModuleInfo *modinfo; + for(modinfo = modules; modinfo; modinfo = modinfo->next) { + if(!(modinfo->state & MODINFO_STATE_STARTED)) { + modinfo->state |= MODINFO_STATE_STARTED; + ((void (*)(void)) modinfo->startfunc)(MODSTATE_STARTSTOP); + } else + ((void (*)(void)) modinfo->startfunc)(MODSTATE_REBIND); + } +} + +void start_modules() { + struct ModuleInfo *modinfo; + for(modinfo = modules; modinfo; modinfo = modinfo->next) { + if(!(modinfo->state & MODINFO_STATE_STARTED)) { + modinfo->state |= MODINFO_STATE_STARTED; + ((void (*)(void)) modinfo->startfunc)(MODSTATE_STARTSTOP); + } + } +} + +void loop_modules() { + struct ModuleInfo *modinfo; + for(modinfo = modules; modinfo; modinfo = modinfo->next) { + ((void (*)(void)) modinfo->loopfunc)(); + } +} + +void stop_modules() { + struct ModuleInfo *modinfo, *next; + for(modinfo = modules; modinfo; modinfo = next) { + next = modinfo->next; + unregister_module_hooks(modinfo->module_id); + ((void (*)(int)) modinfo->stopfunc)(MODSTATE_STARTSTOP); + closemodule(modinfo->module); + free(modinfo->name); + free(modinfo); + } + modules = NULL; +} + +static void unregister_module_hooks(int module_id) { + unregister_module_commands(module_id); + unregister_module_events(module_id); + unregister_module_timers(module_id); +} + +int module_loaded(int module_id) { + if(!module_id) return 1; + struct ModuleInfo *modinfo; + for(modinfo = modules; modinfo; modinfo = modinfo->next) { + if(modinfo->module_id == module_id) + return 1; + } + return 0; +} diff --git a/src/modules.h b/src/modules.h new file mode 100644 index 0000000..321b5c1 --- /dev/null +++ b/src/modules.h @@ -0,0 +1,26 @@ +/* modules.h - NeonServ v5.3 + * Copyright (C) 2011-2012 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 _modules_h +#define _modules_h + +void load_module(char *name); +void start_modules(); +void loop_modules(); +void stop_modules(); +int module_loaded(int module_id); + +#endif \ No newline at end of file diff --git a/src/bot_DummyServ.c b/src/modules/DummyServ.mod/bot_DummyServ.c similarity index 69% rename from src/bot_DummyServ.c rename to src/modules/DummyServ.mod/bot_DummyServ.c index afcb637..9d9d720 100644 --- a/src/bot_DummyServ.c +++ b/src/modules/DummyServ.mod/bot_DummyServ.c @@ -14,6 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#include "../module.h" #include "bot_DummyServ.h" #include "modcmd.h" @@ -64,23 +65,25 @@ static void dummyserv_trigger_callback(int clientid, struct ChanNode *chan, char strcpy(trigger, ""); } -static void start_bots() { +static void start_bots(int type) { struct ClientSocket *client; MYSQL_RES *res, *res2; MYSQL_ROW row; - printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); - res = mysql_use(); - - while ((row = mysql_fetch_row(res)) != NULL) { - client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); - client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); - client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); - client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); - client->flags |= SOCKET_FLAG_SILENT; - client->botid = BOTID; - client->clientid = atoi(row[7]); - connect_socket(client); + if(type == MODSTATE_STARTSTOP) { + printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); + res = mysql_use(); + + while ((row = mysql_fetch_row(res)) != NULL) { + client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); + client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); + client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); + client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); + client->flags |= SOCKET_FLAG_SILENT; + client->botid = BOTID; + client->clientid = atoi(row[7]); + connect_socket(client); + } } printf_mysql_query("SELECT `command`, `function`, `parameters`, `global_access`, `chan_access`, `flags` FROM `bot_binds` WHERE `botclass` = '%d'", BOTID); @@ -103,10 +106,11 @@ static void start_bots() { bind_unbound_required_functions(BOTID); } -void init_DummyServ() { - +void init_DummyServ(int type) { set_bot_alias(BOTID, BOTALIAS); - start_bots(); + start_bots(type); + + if(type == MODSTATE_REBIND) return; //register events bind_bot_ready(dummyserv_bot_ready); @@ -118,8 +122,19 @@ void loop_DummyServ() { } -void free_DummyServ() { - +void free_DummyServ(int type) { + unbind_allcmd(BOTID); + if(type == MODSTATE_STARTSTOP) { + //disconnect all our bots + struct ClientSocket *client; + for(client = getBots(0, NULL); client; client = getBots(0, client)) { + if(client->botid == BOTID) { + unbind_botwise_allcmd(0, client->clientid); + close_socket(client); + break; + } + } + } } #undef BOTID diff --git a/src/bot_DummyServ.h b/src/modules/DummyServ.mod/bot_DummyServ.h similarity index 92% rename from src/bot_DummyServ.h rename to src/modules/DummyServ.mod/bot_DummyServ.h index 79e6f4b..7483fec 100644 --- a/src/bot_DummyServ.h +++ b/src/modules/DummyServ.mod/bot_DummyServ.h @@ -19,8 +19,8 @@ #include "main.h" -void init_DummyServ(); +void init_DummyServ(int type); void loop_DummyServ(); -void free_DummyServ(); +void free_DummyServ(int type); #endif \ No newline at end of file diff --git a/src/modules/DummyServ.mod/module.c b/src/modules/DummyServ.mod/module.c new file mode 100644 index 0000000..1213b68 --- /dev/null +++ b/src/modules/DummyServ.mod/module.c @@ -0,0 +1,36 @@ +/* module.c - NeonServ v5.3 + * Copyright (C) 2011-2012 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 "../module.h" +#include "bot_DummyServ.h" + +static int module_initialize() { + return 0; +} + +static void module_start(int type) { + init_DummyServ(type); +} + +static void module_loop() { + loop_DummyServ(); +} + +static void module_stop(int type) { + free_DummyServ(type); +} + +MODULE_HEADER(module_initialize, module_start, module_loop, module_stop); diff --git a/src/bot_NeonHelp.c b/src/modules/NeonHelp.mod/bot_NeonHelp.c similarity index 93% rename from src/bot_NeonHelp.c rename to src/modules/NeonHelp.mod/bot_NeonHelp.c index 1922262..f3df2fc 100644 --- a/src/bot_NeonHelp.c +++ b/src/modules/NeonHelp.mod/bot_NeonHelp.c @@ -105,25 +105,27 @@ static void neonhelp_trigger_callback(int clientid, struct ChanNode *chan, char strcpy(trigger, ((row[1] && *row[1]) ? row[1] : "!")); } -static void start_bots() { +static void start_bots(int type) { struct ClientSocket *client; MYSQL_RES *res, *res2; MYSQL_ROW row; - printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); - res = mysql_use(); - - while ((row = mysql_fetch_row(res)) != NULL) { - client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); - client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); - client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); - client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); - client->flags |= SOCKET_FLAG_SILENT; - client->botid = BOTID; - client->clientid = atoi(row[7]); - connect_socket(client); - //close old, still opened requests - printf_mysql_query("UPDATE `helpserv_requests` SET `status` = '2' WHERE `botid` = '%d'", client->clientid); + if(type == MODSTATE_STARTSTOP) { + printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); + res = mysql_use(); + + while ((row = mysql_fetch_row(res)) != NULL) { + client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); + client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); + client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); + client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); + client->flags |= SOCKET_FLAG_SILENT; + client->botid = BOTID; + client->clientid = atoi(row[7]); + connect_socket(client); + //close old, still opened requests + printf_mysql_query("UPDATE `helpserv_requests` SET `status` = '2' WHERE `botid` = '%d'", client->clientid); + } } printf_mysql_query("SELECT `command`, `function`, `parameters`, `global_access`, `chan_access`, `flags` FROM `bot_binds` WHERE `botclass` = '%d'", BOTID); @@ -508,11 +510,12 @@ static void neonhelp_event_quit(struct UserNode *target, char *reason) { } } -void init_NeonHelp() { - +void init_NeonHelp(int type) { set_bot_alias(BOTID, BOTALIAS); start_bots(); + if(type == MODSTATE_REBIND) return; + //register events bind_bot_ready(neonhelp_bot_ready); bind_privmsg(neonhelp_event_privmsg); @@ -530,8 +533,19 @@ void loop_NeonHelp() { } -void free_NeonHelp() { - +void free_NeonHelp(int type) { + unbind_allcmd(BOTID); + if(type == MODSTATE_STARTSTOP) { + //disconnect all our bots + struct ClientSocket *client; + for(client = getBots(0, NULL); client; client = getBots(0, client)) { + if(client->botid == BOTID) { + unbind_botwise_allcmd(0, client->clientid); + close_socket(client); + break; + } + } + } } #undef BOTID diff --git a/src/bot_NeonHelp.h b/src/modules/NeonHelp.mod/bot_NeonHelp.h similarity index 94% rename from src/bot_NeonHelp.h rename to src/modules/NeonHelp.mod/bot_NeonHelp.h index 2cbf694..eaf47ff 100644 --- a/src/bot_NeonHelp.h +++ b/src/modules/NeonHelp.mod/bot_NeonHelp.h @@ -38,8 +38,8 @@ struct NeonHelpNode { char **log; }; -void init_NeonHelp(); +void init_NeonHelp(int type); void loop_NeonHelp(); -void free_NeonHelp(); +void free_NeonHelp(int type); #endif \ No newline at end of file diff --git a/src/modules/NeonHelp.mod/cmd_neonhelp.c b/src/modules/NeonHelp.mod/cmd_neonhelp.c new file mode 100644 index 0000000..252d112 --- /dev/null +++ b/src/modules/NeonHelp.mod/cmd_neonhelp.c @@ -0,0 +1,34 @@ +/* cmd_neonhelp.c - NeonServ v5.3 + * Copyright (C) 2011-2012 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 "../module.h" +#include "cmd_neonhelp.h" +#include "modcmd.h" +#include "ConfigParser.h" + +void register_commands() { + //NeonHelp Commands + register_command_alias(4, "NeonHelp"); + + #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,PRIVS,FLAGS) register_command(4, NAME, FUNCTION, PARAMCOUNT, PRIVS, 0, FLAGS) + // NAME FUNCTION PARAMS PRIVS FLAGS + USER_COMMAND("next", neonhelp_cmd_next, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + USER_COMMAND("delete", neonhelp_cmd_delete, 1, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + USER_COMMAND("requests", neonhelp_cmd_requests, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + USER_COMMAND("stats", neonhelp_cmd_stats, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + #undef USER_COMMAND + +} \ No newline at end of file diff --git a/src/cmd_neonhelp.h b/src/modules/NeonHelp.mod/cmd_neonhelp.h similarity index 95% rename from src/cmd_neonhelp.h rename to src/modules/NeonHelp.mod/cmd_neonhelp.h index 0fce87a..9a74fbf 100644 --- a/src/cmd_neonhelp.h +++ b/src/modules/NeonHelp.mod/cmd_neonhelp.h @@ -16,6 +16,7 @@ */ #ifndef _cmd_neonhelp_h #define _cmd_neonhelp_h +#include "../module.h" #include "main.h" #include "modcmd.h" #include "mysqlConn.h" @@ -29,6 +30,8 @@ #include "lang.h" #include "tools.h" +void register_commands(); + CMD_BIND(neonhelp_cmd_delete); CMD_BIND(neonhelp_cmd_next); CMD_BIND(neonhelp_cmd_requests); diff --git a/src/cmd_neonhelp_delete.c b/src/modules/NeonHelp.mod/cmd_neonhelp_delete.c similarity index 100% rename from src/cmd_neonhelp_delete.c rename to src/modules/NeonHelp.mod/cmd_neonhelp_delete.c diff --git a/src/cmd_neonhelp_next.c b/src/modules/NeonHelp.mod/cmd_neonhelp_next.c similarity index 100% rename from src/cmd_neonhelp_next.c rename to src/modules/NeonHelp.mod/cmd_neonhelp_next.c diff --git a/src/cmd_neonhelp_requests.c b/src/modules/NeonHelp.mod/cmd_neonhelp_requests.c similarity index 100% rename from src/cmd_neonhelp_requests.c rename to src/modules/NeonHelp.mod/cmd_neonhelp_requests.c diff --git a/src/cmd_neonhelp_stats.c b/src/modules/NeonHelp.mod/cmd_neonhelp_stats.c similarity index 100% rename from src/cmd_neonhelp_stats.c rename to src/modules/NeonHelp.mod/cmd_neonhelp_stats.c diff --git a/src/modules/NeonHelp.mod/module.c b/src/modules/NeonHelp.mod/module.c new file mode 100644 index 0000000..16ecc77 --- /dev/null +++ b/src/modules/NeonHelp.mod/module.c @@ -0,0 +1,38 @@ +/* module.c - NeonServ v5.3 + * Copyright (C) 2011-2012 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 "../module.h" +#include "bot_NeonHelp.h" +#include "cmd_neonhelp.h" + +static int module_initialize() { + register_commands(); + return 0; +} + +static void module_start(int type) { + init_NeonHelp(type); +} + +static void module_loop() { + loop_NeonHelp(); +} + +static void module_stop(int type) { + free_NeonHelp(type); +} + +MODULE_HEADER(module_initialize, module_start, module_loop, module_stop); diff --git a/src/bot_NeonServ.c b/src/modules/NeonServ.mod/bot_NeonServ.c similarity index 94% rename from src/bot_NeonServ.c rename to src/modules/NeonServ.mod/bot_NeonServ.c index 61d41d6..e6ec912 100644 --- a/src/bot_NeonServ.c +++ b/src/modules/NeonServ.mod/bot_NeonServ.c @@ -14,7 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - +#include "../module.h" + #include "bot_NeonServ.h" #include "modcmd.h" #include "IRCEvents.h" @@ -450,22 +451,23 @@ static void neonserv_trigger_callback(int clientid, struct ChanNode *chan, char strcpy(trigger, ((row[1] && *row[1]) ? row[1] : "~")); } -static void start_bots() { +static void start_bots(int type) { struct ClientSocket *client; MYSQL_RES *res, *res2; MYSQL_ROW row; - printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); - res = mysql_use(); - - while ((row = mysql_fetch_row(res)) != NULL) { - client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); - client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); - client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); - client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); - client->botid = BOTID; - client->clientid = atoi(row[7]); - connect_socket(client); + if(type == MODSTATE_STARTSTOP) { + printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); + res = mysql_use(); + while ((row = mysql_fetch_row(res)) != NULL) { + client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); + client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); + client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); + client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); + client->botid = BOTID; + client->clientid = atoi(row[7]); + connect_socket(client); + } } printf_mysql_query("SELECT `command`, `function`, `parameters`, `global_access`, `chan_access`, `flags` FROM `bot_binds` WHERE `botclass` = '%d'", BOTID); @@ -488,25 +490,26 @@ static void start_bots() { bind_unbound_required_functions(BOTID); } -void init_NeonServ() { - +void init_NeonServ(int type) { set_bot_alias(BOTID, BOTALIAS); - start_bots(); + start_bots(type); + + if(type == MODSTATE_REBIND) return; //register events - bind_bot_ready(neonserv_bot_ready); - bind_join(neonserv_event_join); - bind_part(neonserv_event_part); - bind_quit(neonserv_event_quit); - bind_chanctcp(neonserv_event_chanctcp); - bind_privctcp(general_event_privctcp); - bind_channotice(neonserv_event_channotice); - bind_topic(neonserv_event_topic); - bind_invite(neonserv_event_invite); - bind_mode(neonserv_event_mode); - bind_kick(neonserv_event_kick); + bind_bot_ready(neonserv_bot_ready, module_id); + bind_join(neonserv_event_join, module_id); + bind_part(neonserv_event_part, module_id); + bind_quit(neonserv_event_quit, module_id); + bind_chanctcp(neonserv_event_chanctcp, module_id); + bind_privctcp(general_event_privctcp, module_id); + bind_channotice(neonserv_event_channotice, module_id); + bind_topic(neonserv_event_topic, module_id); + bind_invite(neonserv_event_invite, module_id); + bind_mode(neonserv_event_mode, module_id); + bind_kick(neonserv_event_kick, module_id); - set_trigger_callback(BOTID, neonserv_trigger_callback); + set_trigger_callback(BOTID, module_id, neonserv_trigger_callback); register_default_language_table(msgtab); } @@ -515,8 +518,19 @@ void loop_NeonServ() { } -void free_NeonServ() { - +void free_NeonServ(int type) { + unbind_allcmd(BOTID); + if(type == MODSTATE_STARTSTOP) { + //disconnect all our bots + struct ClientSocket *client; + for(client = getBots(0, NULL); client; client = getBots(0, client)) { + if(client->botid == BOTID) { + unbind_botwise_allcmd(0, client->clientid); + close_socket(client); + break; + } + } + } } #undef BOTID diff --git a/src/bot_NeonServ.h b/src/modules/NeonServ.mod/bot_NeonServ.h similarity index 93% rename from src/bot_NeonServ.h rename to src/modules/NeonServ.mod/bot_NeonServ.h index 397d34f..883275c 100644 --- a/src/bot_NeonServ.h +++ b/src/modules/NeonServ.mod/bot_NeonServ.h @@ -21,9 +21,9 @@ struct ChanNode; -void init_NeonServ(); +void init_NeonServ(int type); void loop_NeonServ(); -void free_NeonServ(); +void free_NeonServ(int type); struct ClientSocket *getBotForChannel(struct ChanNode *chan); diff --git a/src/commands.c b/src/modules/NeonServ.mod/cmd_neonserv.c similarity index 66% rename from src/commands.c rename to src/modules/NeonServ.mod/cmd_neonserv.c index 8705b81..5c24826 100644 --- a/src/commands.c +++ b/src/modules/NeonServ.mod/cmd_neonserv.c @@ -1,4 +1,4 @@ -/* commands.c - NeonServ v5.3 +/* cmd_neonserv.c - NeonServ v5.3 * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify @@ -14,57 +14,16 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - -#include "cmd_global.h" +#include "../module.h" #include "cmd_neonserv.h" -#include "cmd_neonspam.h" -#include "cmd_funcmds.h" -#include "cmd_neonhelp.h" #include "modcmd.h" #include "ConfigParser.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); - USER_COMMAND("commands", global_cmd_commands, 0, NULL, 0); - USER_COMMAND("command", global_cmd_command, 1, NULL, CMDFLAG_ESCAPE_ARGS); - USER_COMMAND("staff", global_cmd_staff, 0, NULL, 0); - USER_COMMAND("motd", global_cmd_motd, 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,0, 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 | CMDFLAG_ESCAPE_ARGS); - OPER_COMMAND("unbind", global_cmd_unbind, 1, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED | CMDFLAG_ESCAPE_ARGS); - OPER_COMMAND("setaccess", global_cmd_setaccess, 2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("bots", global_cmd_bots, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - OPER_COMMAND("reload", global_cmd_reload, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("restart", global_cmd_restart, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("die", global_cmd_die, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("setbot", global_cmd_setbot, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("addbot", global_cmd_addbot, 2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("delbot", global_cmd_delbot, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("reconnect", global_cmd_reconnect, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); - OPER_COMMAND("modcmd", global_cmd_modcmd, 1, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED | CMDFLAG_ESCAPE_ARGS); - OPER_COMMAND("meminfo", global_cmd_meminfo, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - #undef OPER_COMMAND - //NeonServ Commands register_command_alias(1, "NeonServ"); - #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,PRIVS,FLAGS) register_command(1, NAME, FUNCTION, PARAMCOUNT, PRIVS, 0, FLAGS) + #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,PRIVS,FLAGS) register_command(1, NAME, module_id, 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); @@ -123,7 +82,7 @@ void register_commands() { USER_COMMAND("nicklist", neonserv_cmd_nicklist, 0, "1", CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); #undef USER_COMMAND - #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(1, NAME, FUNCTION, PARAMCOUNT, NULL, GACCESS, FLAGS) + #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(1, NAME, module_id, 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); @@ -141,37 +100,4 @@ void register_commands() { OPER_COMMAND("unvisited", neonserv_cmd_unvisited, 0, 400, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); OPER_COMMAND("noregister", neonserv_cmd_noregister,0, 300, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG); #undef OPER_COMMAND - - //NeonSpam Commands - register_command_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 - - //Fun Commands - init_funcmds(); - register_command_alias(3, "FunCMD"); - #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,FLAGS) register_command(3, NAME, FUNCTION, PARAMCOUNT, NULL, 0, FLAGS) - // NAME FUNCTION PARAMS FLAGS - USER_COMMAND("extscript", neonserv_cmd_extscript, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_EMPTY_ARGS | CMDFLAG_CHAN_PARAM | CMDFLAG_FUNCMD); - USER_COMMAND("ping", funcmd_ping, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_FUNCMD); - USER_COMMAND("pong", funcmd_pong, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_FUNCMD); - USER_COMMAND("dice", funcmd_dice, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_FUNCMD); - USER_COMMAND("8ball", funcmd_8ball, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_FUNCMD); - USER_COMMAND("cookie", funcmd_cookie, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_FUNCMD); - #undef USER_COMMAND - - //NeonHelp Commands - register_command_alias(4, "NeonHelp"); - - #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,PRIVS,FLAGS) register_command(4, NAME, FUNCTION, PARAMCOUNT, PRIVS, 0, FLAGS) - // NAME FUNCTION PARAMS PRIVS FLAGS - USER_COMMAND("next", neonhelp_cmd_next, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - USER_COMMAND("delete", neonhelp_cmd_delete, 1, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - USER_COMMAND("requests", neonhelp_cmd_requests, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - USER_COMMAND("stats", neonhelp_cmd_stats, 0, NULL, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - #undef USER_COMMAND - -} \ No newline at end of file +} diff --git a/src/cmd_neonserv.h b/src/modules/NeonServ.mod/cmd_neonserv.h similarity index 98% rename from src/cmd_neonserv.h rename to src/modules/NeonServ.mod/cmd_neonserv.h index 0df1a7b..9c31b16 100644 --- a/src/cmd_neonserv.h +++ b/src/modules/NeonServ.mod/cmd_neonserv.h @@ -16,6 +16,7 @@ */ #ifndef _cmd_neonserv_h #define _cmd_neonserv_h +#include "../module.h" #include "main.h" #include "modcmd.h" #include "IRCParser.h" @@ -39,6 +40,8 @@ #include "bot_NeonServ.h" #include "ConfigParser.h" +void register_commands(); + CMD_BIND(neonserv_cmd_access); CMD_BIND(neonserv_cmd_addban); CMD_BIND(neonserv_cmd_addrank); diff --git a/src/cmd_neonserv_access.c b/src/modules/NeonServ.mod/cmd_neonserv_access.c similarity index 100% rename from src/cmd_neonserv_access.c rename to src/modules/NeonServ.mod/cmd_neonserv_access.c diff --git a/src/cmd_neonserv_addban.c b/src/modules/NeonServ.mod/cmd_neonserv_addban.c similarity index 100% rename from src/cmd_neonserv_addban.c rename to src/modules/NeonServ.mod/cmd_neonserv_addban.c diff --git a/src/cmd_neonserv_addrank.c b/src/modules/NeonServ.mod/cmd_neonserv_addrank.c similarity index 100% rename from src/cmd_neonserv_addrank.c rename to src/modules/NeonServ.mod/cmd_neonserv_addrank.c diff --git a/src/cmd_neonserv_addtimeban.c b/src/modules/NeonServ.mod/cmd_neonserv_addtimeban.c similarity index 100% rename from src/cmd_neonserv_addtimeban.c rename to src/modules/NeonServ.mod/cmd_neonserv_addtimeban.c diff --git a/src/cmd_neonserv_adduser.c b/src/modules/NeonServ.mod/cmd_neonserv_adduser.c similarity index 100% rename from src/cmd_neonserv_adduser.c rename to src/modules/NeonServ.mod/cmd_neonserv_adduser.c diff --git a/src/cmd_neonserv_assignrank.c b/src/modules/NeonServ.mod/cmd_neonserv_assignrank.c similarity index 100% rename from src/cmd_neonserv_assignrank.c rename to src/modules/NeonServ.mod/cmd_neonserv_assignrank.c diff --git a/src/cmd_neonserv_ban.c b/src/modules/NeonServ.mod/cmd_neonserv_ban.c similarity index 100% rename from src/cmd_neonserv_ban.c rename to src/modules/NeonServ.mod/cmd_neonserv_ban.c diff --git a/src/cmd_neonserv_bans.c b/src/modules/NeonServ.mod/cmd_neonserv_bans.c similarity index 100% rename from src/cmd_neonserv_bans.c rename to src/modules/NeonServ.mod/cmd_neonserv_bans.c diff --git a/src/cmd_neonserv_chanservsync.c b/src/modules/NeonServ.mod/cmd_neonserv_chanservsync.c similarity index 100% rename from src/cmd_neonserv_chanservsync.c rename to src/modules/NeonServ.mod/cmd_neonserv_chanservsync.c diff --git a/src/cmd_neonserv_clvl.c b/src/modules/NeonServ.mod/cmd_neonserv_clvl.c similarity index 100% rename from src/cmd_neonserv_clvl.c rename to src/modules/NeonServ.mod/cmd_neonserv_clvl.c diff --git a/src/cmd_neonserv_csuspend.c b/src/modules/NeonServ.mod/cmd_neonserv_csuspend.c similarity index 100% rename from src/cmd_neonserv_csuspend.c rename to src/modules/NeonServ.mod/cmd_neonserv_csuspend.c diff --git a/src/cmd_neonserv_cunsuspend.c b/src/modules/NeonServ.mod/cmd_neonserv_cunsuspend.c similarity index 100% rename from src/cmd_neonserv_cunsuspend.c rename to src/modules/NeonServ.mod/cmd_neonserv_cunsuspend.c diff --git a/src/cmd_neonserv_dehalfop.c b/src/modules/NeonServ.mod/cmd_neonserv_dehalfop.c similarity index 100% rename from src/cmd_neonserv_dehalfop.c rename to src/modules/NeonServ.mod/cmd_neonserv_dehalfop.c diff --git a/src/cmd_neonserv_dehalfopall.c b/src/modules/NeonServ.mod/cmd_neonserv_dehalfopall.c similarity index 100% rename from src/cmd_neonserv_dehalfopall.c rename to src/modules/NeonServ.mod/cmd_neonserv_dehalfopall.c diff --git a/src/cmd_neonserv_delban.c b/src/modules/NeonServ.mod/cmd_neonserv_delban.c similarity index 100% rename from src/cmd_neonserv_delban.c rename to src/modules/NeonServ.mod/cmd_neonserv_delban.c diff --git a/src/cmd_neonserv_delme.c b/src/modules/NeonServ.mod/cmd_neonserv_delme.c similarity index 100% rename from src/cmd_neonserv_delme.c rename to src/modules/NeonServ.mod/cmd_neonserv_delme.c diff --git a/src/cmd_neonserv_delrank.c b/src/modules/NeonServ.mod/cmd_neonserv_delrank.c similarity index 100% rename from src/cmd_neonserv_delrank.c rename to src/modules/NeonServ.mod/cmd_neonserv_delrank.c diff --git a/src/cmd_neonserv_deluser.c b/src/modules/NeonServ.mod/cmd_neonserv_deluser.c similarity index 100% rename from src/cmd_neonserv_deluser.c rename to src/modules/NeonServ.mod/cmd_neonserv_deluser.c diff --git a/src/cmd_neonserv_deop.c b/src/modules/NeonServ.mod/cmd_neonserv_deop.c similarity index 100% rename from src/cmd_neonserv_deop.c rename to src/modules/NeonServ.mod/cmd_neonserv_deop.c diff --git a/src/cmd_neonserv_deopall.c b/src/modules/NeonServ.mod/cmd_neonserv_deopall.c similarity index 100% rename from src/cmd_neonserv_deopall.c rename to src/modules/NeonServ.mod/cmd_neonserv_deopall.c diff --git a/src/cmd_neonserv_devoice.c b/src/modules/NeonServ.mod/cmd_neonserv_devoice.c similarity index 100% rename from src/cmd_neonserv_devoice.c rename to src/modules/NeonServ.mod/cmd_neonserv_devoice.c diff --git a/src/cmd_neonserv_devoiceall.c b/src/modules/NeonServ.mod/cmd_neonserv_devoiceall.c similarity index 100% rename from src/cmd_neonserv_devoiceall.c rename to src/modules/NeonServ.mod/cmd_neonserv_devoiceall.c diff --git a/src/cmd_neonserv_down.c b/src/modules/NeonServ.mod/cmd_neonserv_down.c similarity index 100% rename from src/cmd_neonserv_down.c rename to src/modules/NeonServ.mod/cmd_neonserv_down.c diff --git a/src/cmd_neonserv_downall.c b/src/modules/NeonServ.mod/cmd_neonserv_downall.c similarity index 100% rename from src/cmd_neonserv_downall.c rename to src/modules/NeonServ.mod/cmd_neonserv_downall.c diff --git a/src/cmd_neonserv_events.c b/src/modules/NeonServ.mod/cmd_neonserv_events.c similarity index 100% rename from src/cmd_neonserv_events.c rename to src/modules/NeonServ.mod/cmd_neonserv_events.c diff --git a/src/cmd_neonserv_extscript.c b/src/modules/NeonServ.mod/cmd_neonserv_extscript.c similarity index 100% rename from src/cmd_neonserv_extscript.c rename to src/modules/NeonServ.mod/cmd_neonserv_extscript.c diff --git a/src/cmd_neonserv_giveowner.c b/src/modules/NeonServ.mod/cmd_neonserv_giveowner.c similarity index 100% rename from src/cmd_neonserv_giveowner.c rename to src/modules/NeonServ.mod/cmd_neonserv_giveowner.c diff --git a/src/cmd_neonserv_halfop.c b/src/modules/NeonServ.mod/cmd_neonserv_halfop.c similarity index 100% rename from src/cmd_neonserv_halfop.c rename to src/modules/NeonServ.mod/cmd_neonserv_halfop.c diff --git a/src/cmd_neonserv_halfopall.c b/src/modules/NeonServ.mod/cmd_neonserv_halfopall.c similarity index 100% rename from src/cmd_neonserv_halfopall.c rename to src/modules/NeonServ.mod/cmd_neonserv_halfopall.c diff --git a/src/cmd_neonserv_help.c b/src/modules/NeonServ.mod/cmd_neonserv_help.c similarity index 100% rename from src/cmd_neonserv_help.c rename to src/modules/NeonServ.mod/cmd_neonserv_help.c diff --git a/src/cmd_neonserv_info.c b/src/modules/NeonServ.mod/cmd_neonserv_info.c similarity index 100% rename from src/cmd_neonserv_info.c rename to src/modules/NeonServ.mod/cmd_neonserv_info.c diff --git a/src/cmd_neonserv_invite.c b/src/modules/NeonServ.mod/cmd_neonserv_invite.c similarity index 100% rename from src/cmd_neonserv_invite.c rename to src/modules/NeonServ.mod/cmd_neonserv_invite.c diff --git a/src/cmd_neonserv_inviteme.c b/src/modules/NeonServ.mod/cmd_neonserv_inviteme.c similarity index 100% rename from src/cmd_neonserv_inviteme.c rename to src/modules/NeonServ.mod/cmd_neonserv_inviteme.c diff --git a/src/cmd_neonserv_kick.c b/src/modules/NeonServ.mod/cmd_neonserv_kick.c similarity index 100% rename from src/cmd_neonserv_kick.c rename to src/modules/NeonServ.mod/cmd_neonserv_kick.c diff --git a/src/cmd_neonserv_kickban.c b/src/modules/NeonServ.mod/cmd_neonserv_kickban.c similarity index 100% rename from src/cmd_neonserv_kickban.c rename to src/modules/NeonServ.mod/cmd_neonserv_kickban.c diff --git a/src/cmd_neonserv_listrank.c b/src/modules/NeonServ.mod/cmd_neonserv_listrank.c similarity index 100% rename from src/cmd_neonserv_listrank.c rename to src/modules/NeonServ.mod/cmd_neonserv_listrank.c diff --git a/src/cmd_neonserv_mdeluser.c b/src/modules/NeonServ.mod/cmd_neonserv_mdeluser.c similarity index 100% rename from src/cmd_neonserv_mdeluser.c rename to src/modules/NeonServ.mod/cmd_neonserv_mdeluser.c diff --git a/src/cmd_neonserv_mode.c b/src/modules/NeonServ.mod/cmd_neonserv_mode.c similarity index 100% rename from src/cmd_neonserv_mode.c rename to src/modules/NeonServ.mod/cmd_neonserv_mode.c diff --git a/src/cmd_neonserv_move.c b/src/modules/NeonServ.mod/cmd_neonserv_move.c similarity index 100% rename from src/cmd_neonserv_move.c rename to src/modules/NeonServ.mod/cmd_neonserv_move.c diff --git a/src/cmd_neonserv_myaccess.c b/src/modules/NeonServ.mod/cmd_neonserv_myaccess.c similarity index 100% rename from src/cmd_neonserv_myaccess.c rename to src/modules/NeonServ.mod/cmd_neonserv_myaccess.c diff --git a/src/cmd_neonserv_nicklist.c b/src/modules/NeonServ.mod/cmd_neonserv_nicklist.c similarity index 100% rename from src/cmd_neonserv_nicklist.c rename to src/modules/NeonServ.mod/cmd_neonserv_nicklist.c diff --git a/src/cmd_neonserv_noregister.c b/src/modules/NeonServ.mod/cmd_neonserv_noregister.c similarity index 100% rename from src/cmd_neonserv_noregister.c rename to src/modules/NeonServ.mod/cmd_neonserv_noregister.c diff --git a/src/cmd_neonserv_op.c b/src/modules/NeonServ.mod/cmd_neonserv_op.c similarity index 100% rename from src/cmd_neonserv_op.c rename to src/modules/NeonServ.mod/cmd_neonserv_op.c diff --git a/src/cmd_neonserv_opall.c b/src/modules/NeonServ.mod/cmd_neonserv_opall.c similarity index 100% rename from src/cmd_neonserv_opall.c rename to src/modules/NeonServ.mod/cmd_neonserv_opall.c diff --git a/src/cmd_neonserv_oplog.c b/src/modules/NeonServ.mod/cmd_neonserv_oplog.c similarity index 100% rename from src/cmd_neonserv_oplog.c rename to src/modules/NeonServ.mod/cmd_neonserv_oplog.c diff --git a/src/cmd_neonserv_peek.c b/src/modules/NeonServ.mod/cmd_neonserv_peek.c similarity index 100% rename from src/cmd_neonserv_peek.c rename to src/modules/NeonServ.mod/cmd_neonserv_peek.c diff --git a/src/cmd_neonserv_recover.c b/src/modules/NeonServ.mod/cmd_neonserv_recover.c similarity index 100% rename from src/cmd_neonserv_recover.c rename to src/modules/NeonServ.mod/cmd_neonserv_recover.c diff --git a/src/cmd_neonserv_rename.c b/src/modules/NeonServ.mod/cmd_neonserv_rename.c similarity index 100% rename from src/cmd_neonserv_rename.c rename to src/modules/NeonServ.mod/cmd_neonserv_rename.c diff --git a/src/cmd_neonserv_resync.c b/src/modules/NeonServ.mod/cmd_neonserv_resync.c similarity index 100% rename from src/cmd_neonserv_resync.c rename to src/modules/NeonServ.mod/cmd_neonserv_resync.c diff --git a/src/cmd_neonserv_search.c b/src/modules/NeonServ.mod/cmd_neonserv_search.c similarity index 100% rename from src/cmd_neonserv_search.c rename to src/modules/NeonServ.mod/cmd_neonserv_search.c diff --git a/src/cmd_neonserv_set.c b/src/modules/NeonServ.mod/cmd_neonserv_set.c similarity index 100% rename from src/cmd_neonserv_set.c rename to src/modules/NeonServ.mod/cmd_neonserv_set.c diff --git a/src/cmd_neonserv_setrank.c b/src/modules/NeonServ.mod/cmd_neonserv_setrank.c similarity index 100% rename from src/cmd_neonserv_setrank.c rename to src/modules/NeonServ.mod/cmd_neonserv_setrank.c diff --git a/src/cmd_neonserv_suspend.c b/src/modules/NeonServ.mod/cmd_neonserv_suspend.c similarity index 100% rename from src/cmd_neonserv_suspend.c rename to src/modules/NeonServ.mod/cmd_neonserv_suspend.c diff --git a/src/cmd_neonserv_topic.c b/src/modules/NeonServ.mod/cmd_neonserv_topic.c similarity index 100% rename from src/cmd_neonserv_topic.c rename to src/modules/NeonServ.mod/cmd_neonserv_topic.c diff --git a/src/cmd_neonserv_trace.c b/src/modules/NeonServ.mod/cmd_neonserv_trace.c similarity index 100% rename from src/cmd_neonserv_trace.c rename to src/modules/NeonServ.mod/cmd_neonserv_trace.c diff --git a/src/cmd_neonserv_trim.c b/src/modules/NeonServ.mod/cmd_neonserv_trim.c similarity index 100% rename from src/cmd_neonserv_trim.c rename to src/modules/NeonServ.mod/cmd_neonserv_trim.c diff --git a/src/cmd_neonserv_unban.c b/src/modules/NeonServ.mod/cmd_neonserv_unban.c similarity index 100% rename from src/cmd_neonserv_unban.c rename to src/modules/NeonServ.mod/cmd_neonserv_unban.c diff --git a/src/cmd_neonserv_unbanall.c b/src/modules/NeonServ.mod/cmd_neonserv_unbanall.c similarity index 100% rename from src/cmd_neonserv_unbanall.c rename to src/modules/NeonServ.mod/cmd_neonserv_unbanall.c diff --git a/src/cmd_neonserv_unbanme.c b/src/modules/NeonServ.mod/cmd_neonserv_unbanme.c similarity index 100% rename from src/cmd_neonserv_unbanme.c rename to src/modules/NeonServ.mod/cmd_neonserv_unbanme.c diff --git a/src/cmd_neonserv_unsuspend.c b/src/modules/NeonServ.mod/cmd_neonserv_unsuspend.c similarity index 100% rename from src/cmd_neonserv_unsuspend.c rename to src/modules/NeonServ.mod/cmd_neonserv_unsuspend.c diff --git a/src/cmd_neonserv_unvisited.c b/src/modules/NeonServ.mod/cmd_neonserv_unvisited.c similarity index 100% rename from src/cmd_neonserv_unvisited.c rename to src/modules/NeonServ.mod/cmd_neonserv_unvisited.c diff --git a/src/cmd_neonserv_up.c b/src/modules/NeonServ.mod/cmd_neonserv_up.c similarity index 99% rename from src/cmd_neonserv_up.c rename to src/modules/NeonServ.mod/cmd_neonserv_up.c index 930df02..0085b5f 100644 --- a/src/cmd_neonserv_up.c +++ b/src/modules/NeonServ.mod/cmd_neonserv_up.c @@ -60,7 +60,6 @@ static void neonserv_cmd_up_async1(struct ClientSocket *client, struct ClientSoc reply(getTextBot(), user, "NS_NOT_ON_CHANNEL_YOU", chan->name); return; } - check_mysql(); loadChannelSettings(chan); MYSQL_RES *res, *default_res; MYSQL_ROW row, default_row; diff --git a/src/cmd_neonserv_upall.c b/src/modules/NeonServ.mod/cmd_neonserv_upall.c similarity index 100% rename from src/cmd_neonserv_upall.c rename to src/modules/NeonServ.mod/cmd_neonserv_upall.c diff --git a/src/cmd_neonserv_users.c b/src/modules/NeonServ.mod/cmd_neonserv_users.c similarity index 100% rename from src/cmd_neonserv_users.c rename to src/modules/NeonServ.mod/cmd_neonserv_users.c diff --git a/src/cmd_neonserv_uset.c b/src/modules/NeonServ.mod/cmd_neonserv_uset.c similarity index 100% rename from src/cmd_neonserv_uset.c rename to src/modules/NeonServ.mod/cmd_neonserv_uset.c diff --git a/src/cmd_neonserv_voice.c b/src/modules/NeonServ.mod/cmd_neonserv_voice.c similarity index 100% rename from src/cmd_neonserv_voice.c rename to src/modules/NeonServ.mod/cmd_neonserv_voice.c diff --git a/src/cmd_neonserv_voiceall.c b/src/modules/NeonServ.mod/cmd_neonserv_voiceall.c similarity index 100% rename from src/cmd_neonserv_voiceall.c rename to src/modules/NeonServ.mod/cmd_neonserv_voiceall.c diff --git a/src/cmd_neonserv_wipeinfo.c b/src/modules/NeonServ.mod/cmd_neonserv_wipeinfo.c similarity index 100% rename from src/cmd_neonserv_wipeinfo.c rename to src/modules/NeonServ.mod/cmd_neonserv_wipeinfo.c diff --git a/src/event_neonserv_ctcp.c b/src/modules/NeonServ.mod/event_neonserv_ctcp.c similarity index 100% rename from src/event_neonserv_ctcp.c rename to src/modules/NeonServ.mod/event_neonserv_ctcp.c diff --git a/src/event_neonserv_invite.c b/src/modules/NeonServ.mod/event_neonserv_invite.c similarity index 100% rename from src/event_neonserv_invite.c rename to src/modules/NeonServ.mod/event_neonserv_invite.c diff --git a/src/event_neonserv_join.c b/src/modules/NeonServ.mod/event_neonserv_join.c similarity index 100% rename from src/event_neonserv_join.c rename to src/modules/NeonServ.mod/event_neonserv_join.c diff --git a/src/event_neonserv_kick.c b/src/modules/NeonServ.mod/event_neonserv_kick.c similarity index 100% rename from src/event_neonserv_kick.c rename to src/modules/NeonServ.mod/event_neonserv_kick.c diff --git a/src/event_neonserv_mode.c b/src/modules/NeonServ.mod/event_neonserv_mode.c similarity index 100% rename from src/event_neonserv_mode.c rename to src/modules/NeonServ.mod/event_neonserv_mode.c diff --git a/src/event_neonserv_notice.c b/src/modules/NeonServ.mod/event_neonserv_notice.c similarity index 100% rename from src/event_neonserv_notice.c rename to src/modules/NeonServ.mod/event_neonserv_notice.c diff --git a/src/event_neonserv_part.c b/src/modules/NeonServ.mod/event_neonserv_part.c similarity index 100% rename from src/event_neonserv_part.c rename to src/modules/NeonServ.mod/event_neonserv_part.c diff --git a/src/event_neonserv_quit.c b/src/modules/NeonServ.mod/event_neonserv_quit.c similarity index 100% rename from src/event_neonserv_quit.c rename to src/modules/NeonServ.mod/event_neonserv_quit.c diff --git a/src/event_neonserv_topic.c b/src/modules/NeonServ.mod/event_neonserv_topic.c similarity index 100% rename from src/event_neonserv_topic.c rename to src/modules/NeonServ.mod/event_neonserv_topic.c diff --git a/src/modules/NeonServ.mod/module.c b/src/modules/NeonServ.mod/module.c new file mode 100644 index 0000000..fff4b4b --- /dev/null +++ b/src/modules/NeonServ.mod/module.c @@ -0,0 +1,38 @@ +/* module.c - NeonServ v5.3 + * Copyright (C) 2011-2012 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 "../module.h" +#include "bot_NeonServ.h" +#include "cmd_neonserv.h" + +static int module_initialize() { + register_commands(); + return 0; +} + +static void module_start(int type) { + init_NeonServ(type); +} + +static void module_loop() { + loop_NeonServ(); +} + +static void module_stop(int type) { + free_NeonServ(type); +} + +MODULE_HEADER(module_initialize, module_start, module_loop, module_stop); diff --git a/src/bot_NeonSpam.c b/src/modules/NeonSpam.mod/bot_NeonSpam.c similarity index 90% rename from src/bot_NeonSpam.c rename to src/modules/NeonSpam.mod/bot_NeonSpam.c index 3c08748..5784f63 100644 --- a/src/bot_NeonSpam.c +++ b/src/modules/NeonSpam.mod/bot_NeonSpam.c @@ -14,6 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#include "../module.h" #include "bot_NeonSpam.h" #include "modcmd.h" @@ -151,22 +152,24 @@ static void neonspam_trigger_callback(int clientid, struct ChanNode *chan, char strcpy(trigger, ((row[1] && *row[1]) ? row[1] : "~")); } -static void start_bots() { +static void start_bots(int type) { struct ClientSocket *client; MYSQL_RES *res, *res2; MYSQL_ROW row; - printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); - res = mysql_use(); - - while ((row = mysql_fetch_row(res)) != NULL) { - client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); - client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); - client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); - client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); - client->botid = BOTID; - client->clientid = atoi(row[7]); - connect_socket(client); + if(type == MODSTATE_STARTSTOP) { + printf_mysql_query("SELECT `nick`, `ident`, `realname`, `server`, `port`, `pass`, `textbot`, `id`, `queue`, `ssl`, `bind` FROM `bots` WHERE `botclass` = '%d' AND `active` = '1'", BOTID); + res = mysql_use(); + + while ((row = mysql_fetch_row(res)) != NULL) { + client = create_socket(row[3], atoi(row[4]), row[10], row[5], row[0], row[1], row[2]); + client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); + client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); + client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); + client->botid = BOTID; + client->clientid = atoi(row[7]); + connect_socket(client); + } } printf_mysql_query("SELECT `command`, `function`, `parameters`, `global_access`, `chan_access`, `flags` FROM `bot_binds` WHERE `botclass` = '%d'", BOTID); @@ -322,10 +325,12 @@ static void createSpamNode(struct ChanUser *chanuser) { chanuser->spamnode = spamnode; } -void init_NeonSpam() { +void init_NeonSpam(int type) { set_bot_alias(BOTID, BOTALIAS); - start_bots(); + start_bots(type); + + if(type == MODSTATE_REBIND) return; //register events bind_bot_ready(neonspam_bot_ready); @@ -343,8 +348,19 @@ void loop_NeonSpam() { } -void free_NeonSpam() { - +void free_NeonSpam(int type) { + unbind_allcmd(BOTID); + if(type == MODSTATE_STARTSTOP) { + //disconnect all our bots + struct ClientSocket *client; + for(client = getBots(0, NULL); client; client = getBots(0, client)) { + if(client->botid == BOTID) { + unbind_botwise_allcmd(0, client->clientid); + close_socket(client); + break; + } + } + } } #undef BOTID diff --git a/src/bot_NeonSpam.h b/src/modules/NeonSpam.mod/bot_NeonSpam.h similarity index 98% rename from src/bot_NeonSpam.h rename to src/modules/NeonSpam.mod/bot_NeonSpam.h index a95f3bc..34a24b5 100644 --- a/src/bot_NeonSpam.h +++ b/src/modules/NeonSpam.mod/bot_NeonSpam.h @@ -139,9 +139,9 @@ struct NeonSpamJoinNode { struct NeonSpamJoinNode *next; }; -void init_NeonSpam(); +void init_NeonSpam(int type); void loop_NeonSpam(); -void free_NeonSpam(); +void free_NeonSpam(int type); void freeNeonSpamSettings(struct NeonSpamSettings *settings); char* convertNeonSpamSettingsToString(unsigned int flags, char *buffer); diff --git a/src/modules/NeonSpam.mod/cmd_neonspam.c b/src/modules/NeonSpam.mod/cmd_neonspam.c new file mode 100644 index 0000000..f013299 --- /dev/null +++ b/src/modules/NeonSpam.mod/cmd_neonspam.c @@ -0,0 +1,32 @@ +/* cmd_neonspam.c - NeonServ v5.3 + * Copyright (C) 2011-2012 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 "../module.h" + +#include "cmd_neonspam.h" +#include "modcmd.h" +#include "ConfigParser.h" + +void register_commands() { + //NeonSpam Commands + register_command_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/cmd_neonspam.h b/src/modules/NeonSpam.mod/cmd_neonspam.h similarity index 100% rename from src/cmd_neonspam.h rename to src/modules/NeonSpam.mod/cmd_neonspam.h diff --git a/src/cmd_neonspam_set.c b/src/modules/NeonSpam.mod/cmd_neonspam_set.c similarity index 100% rename from src/cmd_neonspam_set.c rename to src/modules/NeonSpam.mod/cmd_neonspam_set.c diff --git a/src/event_neonspam_chanmsg.c b/src/modules/NeonSpam.mod/event_neonspam_chanmsg.c similarity index 100% rename from src/event_neonspam_chanmsg.c rename to src/modules/NeonSpam.mod/event_neonspam_chanmsg.c diff --git a/src/event_neonspam_join.c b/src/modules/NeonSpam.mod/event_neonspam_join.c similarity index 100% rename from src/event_neonspam_join.c rename to src/modules/NeonSpam.mod/event_neonspam_join.c diff --git a/src/modules/NeonSpam.mod/module.c b/src/modules/NeonSpam.mod/module.c new file mode 100644 index 0000000..64581de --- /dev/null +++ b/src/modules/NeonSpam.mod/module.c @@ -0,0 +1,38 @@ +/* module.c - NeonServ v5.3 + * Copyright (C) 2011-2012 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 "../module.h" +#include "bot_NeonSpam.h" +#include "cmd_neonspam.h" + +static int module_initialize() { + register_commands(); + return 0; +} + +static void module_start(int type) { + init_NeonSpam(type); +} + +static void module_loop() { + loop_NeonSpam(); +} + +static void module_stop(int type) { + free_NeonSpam(type); +} + +MODULE_HEADER(module_initialize, module_start, module_loop, module_stop); diff --git a/src/cmd_funcmds.c b/src/modules/funcmd.mod/cmd_funcmds.c similarity index 87% rename from src/cmd_funcmds.c rename to src/modules/funcmd.mod/cmd_funcmds.c index 3f4095a..dc3cb8b 100644 --- a/src/cmd_funcmds.c +++ b/src/modules/funcmd.mod/cmd_funcmds.c @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - +#include "../module.h" #include "cmd_funcmds.h" #include "modcmd.h" #include "mysqlConn.h" @@ -40,6 +40,20 @@ void init_funcmds() { srand(time(NULL)); } +void register_commands() { + //Fun Commands + register_command_alias(3, "FunCMD"); + #define USER_COMMAND(NAME,FUNCTION,PARAMCOUNT,FLAGS) register_command(3, NAME, FUNCTION, PARAMCOUNT, NULL, 0, FLAGS) + // NAME FUNCTION PARAMS FLAGS + USER_COMMAND("extscript", neonserv_cmd_extscript, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_EMPTY_ARGS | CMDFLAG_CHAN_PARAM | CMDFLAG_FUNCMD); + USER_COMMAND("ping", funcmd_ping, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_FUNCMD); + USER_COMMAND("pong", funcmd_pong, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_FUNCMD); + USER_COMMAND("dice", funcmd_dice, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_FUNCMD); + USER_COMMAND("8ball", funcmd_8ball, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_FUNCMD); + USER_COMMAND("cookie", funcmd_cookie, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_FUNCMD); + #undef USER_COMMAND +} + struct current_funcmd_header { struct ClientSocket *client; struct UserNode *user; diff --git a/src/cmd_funcmds.h b/src/modules/funcmd.mod/cmd_funcmds.h similarity index 94% rename from src/cmd_funcmds.h rename to src/modules/funcmd.mod/cmd_funcmds.h index 37dc779..70125dd 100644 --- a/src/cmd_funcmds.h +++ b/src/modules/funcmd.mod/cmd_funcmds.h @@ -16,10 +16,12 @@ */ #ifndef _cmd_funcmds_h #define _cmd_funcmds_h +#include "../module.h" #include "main.h" #include "modcmd.h" void init_funcmds(); +void register_commands(); CMD_BIND(funcmd_ping); CMD_BIND(funcmd_pong); diff --git a/src/modules/funcmd.mod/module.c b/src/modules/funcmd.mod/module.c new file mode 100644 index 0000000..c23dea7 --- /dev/null +++ b/src/modules/funcmd.mod/module.c @@ -0,0 +1,38 @@ +/* module.c - NeonServ v5.3 + * Copyright (C) 2011-2012 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 "../module.h" +#include "cmd_funcmds.h" + +static int module_initialize() { + init_funcmds(); + register_commands(); + return 0; +} + +static void module_start(int type) { + +} + +static void module_loop() { + +} + +static void module_stop(int type) { + +} + +MODULE_HEADER(module_initialize, module_start, module_loop, module_stop); diff --git a/src/modules/global.mod/cmd_global.c b/src/modules/global.mod/cmd_global.c new file mode 100644 index 0000000..9741e6c --- /dev/null +++ b/src/modules/global.mod/cmd_global.c @@ -0,0 +1,59 @@ +/* cmd_global.c - NeonServ v5.3 + * Copyright (C) 2011-2012 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 "../module.h" +#include "cmd_global.h" +#include "modcmd.h" +#include "ConfigParser.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); + USER_COMMAND("commands", global_cmd_commands, 0, NULL, 0); + USER_COMMAND("command", global_cmd_command, 1, NULL, CMDFLAG_ESCAPE_ARGS); + USER_COMMAND("staff", global_cmd_staff, 0, NULL, 0); + USER_COMMAND("motd", global_cmd_motd, 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,0, 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 | CMDFLAG_ESCAPE_ARGS); + OPER_COMMAND("unbind", global_cmd_unbind, 1, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED | CMDFLAG_ESCAPE_ARGS); + OPER_COMMAND("setaccess", global_cmd_setaccess, 2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("bots", global_cmd_bots, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + OPER_COMMAND("reload", global_cmd_reload, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("restart", global_cmd_restart, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("die", global_cmd_die, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("setbot", global_cmd_setbot, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("addbot", global_cmd_addbot, 2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("delbot", global_cmd_delbot, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("reconnect", global_cmd_reconnect, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); + OPER_COMMAND("modcmd", global_cmd_modcmd, 1, 900, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED | CMDFLAG_ESCAPE_ARGS); + OPER_COMMAND("meminfo", global_cmd_meminfo, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + #undef OPER_COMMAND +} \ No newline at end of file diff --git a/src/cmd_global.h b/src/modules/global.mod/cmd_global.h similarity index 97% rename from src/cmd_global.h rename to src/modules/global.mod/cmd_global.h index 55bb5a7..5b3f553 100644 --- a/src/cmd_global.h +++ b/src/modules/global.mod/cmd_global.h @@ -16,6 +16,7 @@ */ #ifndef _cmd_global_h #define _cmd_global_h +#include "../module.h" #include "main.h" #include "modcmd.h" #include "IRCParser.h" @@ -37,6 +38,8 @@ #include "EventLogger.h" #include "bots.h" +void register_commands(); + CMD_BIND(global_cmd_addbot); CMD_BIND(global_cmd_bind); CMD_BIND(global_cmd_bots); diff --git a/src/cmd_global_addbot.c b/src/modules/global.mod/cmd_global_addbot.c similarity index 100% rename from src/cmd_global_addbot.c rename to src/modules/global.mod/cmd_global_addbot.c diff --git a/src/cmd_global_bind.c b/src/modules/global.mod/cmd_global_bind.c similarity index 100% rename from src/cmd_global_bind.c rename to src/modules/global.mod/cmd_global_bind.c diff --git a/src/cmd_global_bots.c b/src/modules/global.mod/cmd_global_bots.c similarity index 100% rename from src/cmd_global_bots.c rename to src/modules/global.mod/cmd_global_bots.c diff --git a/src/cmd_global_command.c b/src/modules/global.mod/cmd_global_command.c similarity index 100% rename from src/cmd_global_command.c rename to src/modules/global.mod/cmd_global_command.c diff --git a/src/cmd_global_commands.c b/src/modules/global.mod/cmd_global_commands.c similarity index 100% rename from src/cmd_global_commands.c rename to src/modules/global.mod/cmd_global_commands.c diff --git a/src/cmd_global_delbot.c b/src/modules/global.mod/cmd_global_delbot.c similarity index 100% rename from src/cmd_global_delbot.c rename to src/modules/global.mod/cmd_global_delbot.c diff --git a/src/cmd_global_die.c b/src/modules/global.mod/cmd_global_die.c similarity index 100% rename from src/cmd_global_die.c rename to src/modules/global.mod/cmd_global_die.c diff --git a/src/cmd_global_emote.c b/src/modules/global.mod/cmd_global_emote.c similarity index 100% rename from src/cmd_global_emote.c rename to src/modules/global.mod/cmd_global_emote.c diff --git a/src/cmd_global_god.c b/src/modules/global.mod/cmd_global_god.c similarity index 100% rename from src/cmd_global_god.c rename to src/modules/global.mod/cmd_global_god.c diff --git a/src/cmd_global_meminfo.c b/src/modules/global.mod/cmd_global_meminfo.c similarity index 100% rename from src/cmd_global_meminfo.c rename to src/modules/global.mod/cmd_global_meminfo.c diff --git a/src/cmd_global_modcmd.c b/src/modules/global.mod/cmd_global_modcmd.c similarity index 100% rename from src/cmd_global_modcmd.c rename to src/modules/global.mod/cmd_global_modcmd.c diff --git a/src/cmd_global_motd.c b/src/modules/global.mod/cmd_global_motd.c similarity index 100% rename from src/cmd_global_motd.c rename to src/modules/global.mod/cmd_global_motd.c diff --git a/src/cmd_global_netinfo.c b/src/modules/global.mod/cmd_global_netinfo.c similarity index 100% rename from src/cmd_global_netinfo.c rename to src/modules/global.mod/cmd_global_netinfo.c diff --git a/src/cmd_global_notice.c b/src/modules/global.mod/cmd_global_notice.c similarity index 100% rename from src/cmd_global_notice.c rename to src/modules/global.mod/cmd_global_notice.c diff --git a/src/cmd_global_raw.c b/src/modules/global.mod/cmd_global_raw.c similarity index 100% rename from src/cmd_global_raw.c rename to src/modules/global.mod/cmd_global_raw.c diff --git a/src/cmd_global_reconnect.c b/src/modules/global.mod/cmd_global_reconnect.c similarity index 100% rename from src/cmd_global_reconnect.c rename to src/modules/global.mod/cmd_global_reconnect.c diff --git a/src/cmd_global_register.c b/src/modules/global.mod/cmd_global_register.c similarity index 100% rename from src/cmd_global_register.c rename to src/modules/global.mod/cmd_global_register.c diff --git a/src/cmd_global_reload.c b/src/modules/global.mod/cmd_global_reload.c similarity index 100% rename from src/cmd_global_reload.c rename to src/modules/global.mod/cmd_global_reload.c diff --git a/src/cmd_global_reloadlang.c b/src/modules/global.mod/cmd_global_reloadlang.c similarity index 100% rename from src/cmd_global_reloadlang.c rename to src/modules/global.mod/cmd_global_reloadlang.c diff --git a/src/cmd_global_restart.c b/src/modules/global.mod/cmd_global_restart.c similarity index 100% rename from src/cmd_global_restart.c rename to src/modules/global.mod/cmd_global_restart.c diff --git a/src/cmd_global_say.c b/src/modules/global.mod/cmd_global_say.c similarity index 100% rename from src/cmd_global_say.c rename to src/modules/global.mod/cmd_global_say.c diff --git a/src/cmd_global_setaccess.c b/src/modules/global.mod/cmd_global_setaccess.c similarity index 100% rename from src/cmd_global_setaccess.c rename to src/modules/global.mod/cmd_global_setaccess.c diff --git a/src/cmd_global_setbot.c b/src/modules/global.mod/cmd_global_setbot.c similarity index 99% rename from src/cmd_global_setbot.c rename to src/modules/global.mod/cmd_global_setbot.c index e823a9e..88ffeac 100644 --- a/src/cmd_global_setbot.c +++ b/src/modules/global.mod/cmd_global_setbot.c @@ -151,7 +151,7 @@ static int global_cmd_setbot_active(struct UserNode *user, MYSQL_ROW bot, char * struct ClientSocket *client; for(client = getBots(0, NULL); client; client = getBots(0, client)) { if(client->clientid == atoi(bot[15])) { - unbind_botwise_allcmd(client->clientid); + unbind_botwise_allcmd(0, client->clientid); close_socket(client); break; } diff --git a/src/cmd_global_staff.c b/src/modules/global.mod/cmd_global_staff.c similarity index 100% rename from src/cmd_global_staff.c rename to src/modules/global.mod/cmd_global_staff.c diff --git a/src/cmd_global_unbind.c b/src/modules/global.mod/cmd_global_unbind.c similarity index 100% rename from src/cmd_global_unbind.c rename to src/modules/global.mod/cmd_global_unbind.c diff --git a/src/cmd_global_unregister.c b/src/modules/global.mod/cmd_global_unregister.c similarity index 100% rename from src/cmd_global_unregister.c rename to src/modules/global.mod/cmd_global_unregister.c diff --git a/src/cmd_global_version.c b/src/modules/global.mod/cmd_global_version.c similarity index 100% rename from src/cmd_global_version.c rename to src/modules/global.mod/cmd_global_version.c diff --git a/src/modules/global.mod/module.c b/src/modules/global.mod/module.c new file mode 100644 index 0000000..3fe2703 --- /dev/null +++ b/src/modules/global.mod/module.c @@ -0,0 +1,37 @@ +/* module.c - NeonServ v5.3 + * Copyright (C) 2011-2012 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 "../module.h" +#include "cmd_global.h" + +static int module_initialize() { + register_commands(); + return 0; +} + +static void module_start(int type) { + +} + +static void module_loop() { + +} + +static void module_stop(int type) { + +} + +MODULE_HEADER(module_initialize, module_start, module_loop, module_stop); diff --git a/src/modules/module.h b/src/modules/module.h new file mode 100644 index 0000000..6fc0a8c --- /dev/null +++ b/src/modules/module.h @@ -0,0 +1,241 @@ +/* module.h - NeonServ v5.3 + * Copyright (C) 2011-2012 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 _module_h +#define _module_h +#define DND_FUNCTIONS 1 /* DoNotDefine_Functions */ +#include "../overall.h" +#include "../version.h" +#include "../mysqlConn.h" + +extern void **global; +extern int module_id; + +/**** global function list ****/ +/* 000 */ #define getStartTime ((time_t (*)(void))global[0]) +/* 001 */ #define getRunningThreads ((int (*)(void))global[1]) +/* 002 */ #define exit_daemon ((int (*)(void))global[2]) +/* 003 */ #define stricmp ((int (*)(const char *, const char *))global[3]) +/* 004 */ #define stricmplen ((int (*)(const char *, const char *, int))global[4]) +/* 005 */ #define restart_process ((void (*)(void))global[5]) +/* 006 */ #define cleanup ((void (*)(void))global[6]) +/* 007 */ #define restart_bot ((void (*)(int))global[7]) +/* 008 */ #define stop_bot ((void (*)(void))global[8]) +/* 009 */ #define reload_config ((void (*)(void))global[9]) +/* 010 */ #define putlog ((void (*)(int, const char *, ...))global[10]) +#ifdef HAVE_THREADS +/* 011 */ #define getCurrentThreadID ((int (*)(void))global[11]) +#endif +/* 012 */ #define getMatchingChannelBan ((struct BanNode* (*)(struct ChanNode *, char *))global[12]) +/* 013 */ #define getChannelBot ((struct ClientSocket* (*)(struct ChanNode *, int))global[13]) +/* 014 */ #define requestOp ((void (*)(struct UserNode *, struct ChanNode *))global[14]) +/* 015 */ #define channel_ban_timeout ((void (*)(void *))global[15]) +/* 016 */ #define general_event_privctcp ((void (*)(struct UserNode *, struct UserNode *, char *, char *))global[16]) +/* 017 */ #define set_bot_alias ((void (*)(int, char *))global[17]) +/* 018 */ #define resolve_botid ((const char * (*)(int))global[18]) +/* 019 */ #define resolve_botalias ((int (*)(const char *))global[19]) +/* 020 */ #define is_valid_chan ((int (*)(const char *))global[20]) +/* 021 */ #define getAllChans ((struct ChanNode* (*)(struct ChanNode *))global[21]) +/* 022 */ #define getChanByName ((struct ChanNode* (*)(const char *))global[22]) +/* 023 */ #define getChannelCount ((int (*)(void))global[23]) +/* 024 */ #define getChanUserCount ((int (*)(void))global[24]) +/* 025 */ #define getChanBanCount ((int (*)(void))global[25]) +/* 026 */ #define isUserOnChan ((int (*)(struct UserNode *, struct ChanNode *))global[26]) +/* 027 */ #define getChanUser ((struct ChanUser* (*)(struct UserNode *, struct ChanNode *))global[27]) +/* 028 */ #define getChannelUsers ((struct ChanUser* (*)(struct ChanNode *, struct ChanUser *))global[28]) +/* 029 */ #define getUserChannels ((struct ChanUser* (*)(struct UserNode *, struct ChanUser *))global[29]) +/* 030 */ #define create_socket ((struct ClientSocket* (*)(char *, int, char *, char *, char *, char *, char *))global[30]) +/* 031 */ #define connect_socket ((int (*)(struct ClientSocket *))global[31]) +/* 032 */ #define close_socket ((int (*)(struct ClientSocket *))global[32]) +/* 033 */ #define disconnect_socket ((int (*)(struct ClientSocket *))global[33]) +/* 034 */ #define write_socket ((int (*)(struct ClientSocket *, char*, int))global[34]) +/* 035 */ #define putsock ((void (*)(struct ClientSocket *, const char *, ...))global[35]) +/* 036 */ #define getBots ((struct ClientSocket* (*)(int, struct ClientSocket *))global[36]) +/* 037 */ #define get_int_field ((int (*)(char *))global[37]) +/* 038 */ #define get_string_field ((char * (*)(char *))global[38]) +/* 039 */ #define _loadUserSettings ((void (*)(struct UserNode *))global[39]) +/* 040 */ #define isGodMode ((int (*)(struct UserNode *))global[40]) +/* 041 */ #define getChanDefault ((char * (*)(char *))global[41]) +/* 042 */ #define getChannelAccess ((int (*)(struct UserNode *, struct ChanNode *))global[42]) +/* 043 */ #define checkChannelAccess ((int (*)(struct UserNode *, struct ChanNode *, char *, int))global[43]) +/* 044 */ #define _loadChannelSettings ((void (*)(struct ChanNode *))global[44]) +/* 045 */ #define isUserProtected ((int (*)(struct ChanNode *, struct UserNode *, struct UserNode *))global[45]) +/* 046 */ #define getBanAffectingMask ((char * (*)(struct ChanNode *, char *))global[46]) +/* 047 */ #define renameAccount ((int (*)(char *, char *))global[47]) +/* 048 */ #define deleteUser ((void (*)(int))global[48]) +/* 049 */ #define logEvent ((void (*)(struct Event *))global[49]) +/* 050 */ #define lookup_authname ((void (*)(char *, authlookup_callback_t, void *))global[50]) +/* 051 */ #define bind_join ((int (*)(join_func_t *, int))global[51]) +/* 052 */ #define unbind_join ((void (*)(join_func_t *))global[52]) +/* 053 */ #define bind_nick ((int (*)(nick_func_t *, int))global[53]) +/* 054 */ #define unbind_nick ((void (*)(nick_func_t *))global[54]) +/* 055 */ #define bind_part ((int (*)(part_func_t *, int))global[55]) +/* 056 */ #define unbind_part ((void (*)(part_func_t *))global[56]) +/* 057 */ #define bind_quit ((int (*)(quit_func_t *, int))global[57]) +/* 058 */ #define unbind_quit ((void (*)(quit_func_t *))global[58]) +/* 059 */ #define bind_kick ((int (*)(kick_func_t *, int))global[59]) +/* 060 */ #define unbind_kick ((void (*)(kick_func_t *))global[60]) +/* 061 */ #define bind_topic ((int (*)(topic_func_t *, int))global[61]) +/* 062 */ #define unbind_topic ((void (*)(topic_func_t *))global[62]) +/* 063 */ #define bind_mode ((int (*)(mode_func_t *, int))global[63]) +/* 064 */ #define unbind_mode ((void (*)(mode_func_t *))global[64]) +/* 065 */ #define bind_chanmsg ((int (*)(chanmsg_func_t *, int))global[65]) +/* 066 */ #define unbind_chanmsg ((void (*)(chanmsg_func_t *))global[66]) +/* 067 */ #define bind_privmsg ((int (*)(privmsg_func_t *, int))global[67]) +/* 068 */ #define unbind_privmsg ((void (*)(privmsg_func_t *))global[68]) +/* 069 */ #define bind_channotice ((int (*)(channotice_func_t *, int))global[69]) +/* 070 */ #define unbind_channotice ((void (*)(channotice_func_t *))global[70]) +/* 071 */ #define bind_privnotice ((int (*)(privnotice_func_t *, int))global[71]) +/* 072 */ #define unbind_privnotice ((void (*)(privnotice_func_t *))global[72]) +/* 073 */ #define bind_chanctcp ((int (*)(chanctcp_func_t *, int))global[73]) +/* 074 */ #define unbind_chanctcp ((void (*)(chanctcp_func_t *))global[74]) +/* 075 */ #define bind_privctcp ((int (*)(privctcp_func_t *, int))global[75]) +/* 076 */ #define unbind_privctcp ((void (*)(privctcp_func_t *))global[76]) +/* 077 */ #define bind_invite ((int (*)(invite_func_t *, int))global[77]) +/* 078 */ #define unbind_invite ((void (*)(invite_func_t *))global[78]) +/* 079 */ #define bind_raw ((int (*)(raw_func_t *, int))global[79]) +/* 080 */ #define unbind_raw ((void (*)(raw_func_t *))global[80]) +/* 081 */ #define bind_bot_ready ((int (*)(bot_ready_func_t *, int))global[81]) +/* 082 */ #define unbind_bot_ready ((void (*)(bot_ready_func_t *))global[82]) +/* 083 */ #define bind_registered ((int (*)(registered_func_t *, int))global[83]) +/* 084 */ #define unbind_registered ((void (*)(registered_func_t *))global[84]) +/* 085 */ #define bind_freeuser ((int (*)(freeuser_func_t *, int))global[85]) +/* 086 */ #define unbind_freeuser ((void (*)(freeuser_func_t *))global[86]) +/* 087 */ #define bind_freechan ((int (*)(freechan_func_t *, int))global[87]) +/* 088 */ #define unbind_freechan ((void (*)(freechan_func_t *))global[88]) +/* 089 */ #define reply ((void (*)(struct ClientSocket *, struct UserNode *, const char *, ...))global[89]) +/* 090 */ #define merge_argv ((char * (*)(char **, int, int))global[90]) +/* 091 */ #define merge_argv_char ((char * (*)(char **, int, int, char))global[91]) +/* 092 */ #define get_language_by_tag ((struct language * (*)(char *))global[92]) +/* 093 */ #define get_language_by_name ((struct language * (*)(char *))global[93]) +/* 094 */ #define get_default_language ((struct language * (*)(void))global[94]) +/* 095 */ #define load_language ((void (*)(char *, char *))global[95]) +/* 096 */ #define register_default_language_table ((void (*)(const struct default_language_entry *))global[96]) +/* 097 */ #define get_language_string ((char * (*)(struct UserNode *, const char *))global[97]) +/* 098 */ #define build_language_string ((char * (*)(struct UserNode *, char *, const char *, ...))global[98]) +#ifdef ENABLE_MEMORY_DEBUG +/* 099 */ #define xmalloc ((void * (*)(unsigned int, const char *, unsigned int))global[99]) +/* 100 */ #define xcalloc ((void * (*)(unsigned int, unsigned int, const char *, unsigned int))global[100]) +/* 101 */ #define xstrdup ((char * (*)(const char *, const char *, unsigned int))global[101]) +/* 102 */ #define xfree ((void (*)(void *))global[102]) +#endif +/* 103 */ #define getMemoryInfoFiles ((struct memoryInfoFiles * (*)(void))global[103]) +/* 104 */ #define freeMemoryInfoFiles ((void (*)(struct memoryInfoFiles *))global[104]) +/* 105 */ #define getMemoryInfoLines ((struct memoryInfoLines * (*)(const char *))global[105]) +/* 106 */ #define freeMemoryInfoLines ((void (*)(struct memoryInfoLines *))global[106]) +/* 107 */ #define get_botwise_prefered_bot ((struct ClientSocket * (*)(int, int))global[107]) +/* 108 */ #define register_command ((int (*)(int, char *, int, cmd_bind_t *, int, char *, int, unsigned int))global[108]) +/* 109 */ #define set_trigger_callback ((int (*)(int, int, trigger_callback_t *))global[109]) +/* 110 */ #define flush_trigger_cache ((int (*)(int, int))global[110]) +/* 111 */ #define changeBotwiseChannelTrigger ((int (*)(int, int, struct ChanNode *, char *))global[111]) +/* 112 */ #define bind_botwise_cmd_to_function ((int (*)(int, int, char *, struct cmd_function *))global[112]) +/* 113 */ #define bind_botwise_cmd_to_command ((int (*)(int, int, char *, char *))global[113]) +/* 114 */ #define unbind_botwise_cmd ((int (*)(int, int, char *))global[114]) +/* 115 */ #define unbind_botwise_allcmd ((int (*)(int, int))global[115]) +/* 116 */ #define bind_botwise_set_parameters ((void (*)(int, int, char *, char *))global[116]) +/* 117 */ #define bind_botwise_set_global_access ((void (*)(int, int, char *, int))global[117]) +/* 118 */ #define bind_botwise_set_channel_access ((void (*)(int, int, char *, char *))global[118]) +/* 119 */ #define bind_botwise_set_bind_flags ((void (*)(int, int, char *, unsigned int))global[119]) +/* 120 */ #define find_botwise_cmd_binding ((struct cmd_binding * (*)(int, int, char *))global[120]) +/* 121 */ #define bind_botwise_unbound_required_functions ((void (*)(int, int))global[121]) +/* 122 */ #define find_cmd_function ((struct cmd_function * (*)(int , char *))global[122]) +/* 123 */ #define getTextBot ((struct ClientSocket * (*)(void))global[123]) +/* 124 */ #define register_command_alias ((void (*)(int, char *))global[124]) +/* 125 */ #define getAllBinds ((struct cmd_binding * (*)(struct cmd_binding *))global[125]) +/* 126 */ #define createModeNode ((struct ModeNode * (*)(struct ChanNode *))global[126]) +/* 127 */ #define freeModeNode ((void (*)(struct ModeNode *))global[127]) +/* 128 */ #define isModeSet ((int (*)(struct ModeNode *, char))global[128]) +/* 129 */ #define isModeAffected ((int (*)(struct ModeNode *, char))global[129]) +/* 130 */ #define getModeValue ((void * (*)(struct ModeNode *, char))global[130]) +/* 131 */ #define getModeType ((unsigned int (*)(struct ModeNode *, char))global[131]) +/* 132 */ #define parseModes ((void (*)(struct ModeNode *, char *, char **, int))global[132]) +/* 133 */ #define parseModeString ((void (*)(struct ModeNode *, char *))global[133]) +/* 134 */ #define parseMode ((int (*)(struct ModeNode *, int, char, char *))global[134]) +/* 135 */ #define getModeString ((void (*)(struct ModeNode *, char *))global[135]) +/* 136 */ #define getFullModeString ((void (*)(struct ModeNode *, char *))global[136]) +/* 137 */ #define mysql_use ((MYSQL_RES * (*)(void))global[137]) +/* 138 */ #define mysql_free ((void (*)(void))global[138]) +/* 139 */ #define printf_mysql_query ((void (*)(const char *, ...))global[139]) +/* 140 */ #define printf_long_mysql_query ((void (*)(int, const char *, ...))global[140]) +/* 141 */ #define escape_string ((char * (*)(const char *))global[141]) +/* 142 */ #define get_mysql_conn ((MYSQL * (*)(void))global[142]) +/* 143 */ #define timeq_add ((struct timeq_entry * (*)(int, int, timeq_callback_t *, void *))global[143]) +/* 144 */ #define timeq_uadd ((struct timeq_entry * (*)(int, int, timeq_callback_t *, void *))global[144]) +/* 145 */ #define timeq_add_name ((struct timeq_entry * (*)(char *, int, int, timeq_callback_t *, void *))global[145]) +/* 146 */ #define timeq_uadd_name ((struct timeq_entry * (*)(char *, int, int, timeq_callback_t *, void *))global[146]) +/* 147 */ #define timeq_del ((int (*)(struct timeq_entry *))global[147]) +/* 148 */ #define timeq_del_name ((int (*)(char *))global[148]) +/* 149 */ #define timeq_name_exists ((int (*)(char *))global[149]) +/* 150 */ #define match ((int (*)(const char *, const char *))global[150]) +/* 151 */ #define table_init ((struct Table * (*)(int, int, int))global[151]) +/* 152 */ #define table_add ((int (*)(struct Table *, char **))global[152]) +/* 153 */ #define table_change ((int (*)(struct Table *, int, char **))global[153]) +/* 154 */ #define table_change_field ((int (*)(struct Table *, int, int, char *))global[154]) +/* 155 */ #define table_set_bold ((int (*)(struct Table *, int, int))global[155]) +/* 156 */ #define table_end ((char ** (*)(struct Table *))global[156]) +/* 157 */ #define table_free ((void (*)(struct Table *))global[157]) +/* 158 */ #define timeToStr ((char * (*)(struct UserNode *, int, int, char *))global[158]) +/* 159 */ #define strToTime ((int (*)(struct UserNode *, char *))global[159]) +/* 160 */ #define initModeBuffer ((struct ModeBuffer * (*)(struct ClientSocket *, struct ChanNode *))global[160]) +/* 161 */ #define modeBufferSet ((void (*)(struct ModeBuffer *, int, char, char *))global[161]) +/* 162 */ #define flushModeBuffer ((void (*)(struct ModeBuffer *))global[162]) +/* 163 */ #define freeModeBuffer ((void (*)(struct ModeBuffer *))global[163]) +/* 164 */ #define is_ircmask ((int (*)(const char *))global[164]) +/* 165 */ #define generate_banmask ((char * (*)(struct UserNode *, char *))global[165]) +/* 166 */ #define make_banmask ((char * (*)(char *, char *))global[166]) +/* 167 */ #define isFakeHost ((int (*)(char *))global[167]) +/* 168 */ #define mask_match ((int (*)(char *, struct UserNode *))global[168]) +/* 169 */ #define crc32 ((unsigned long (*)(const char *))global[169]) +/* 170 */ #define is_valid_nick ((int (*)(const char *))global[170]) +/* 171 */ #define getUserByNick ((struct UserNode * (*)(const char *))global[171]) +/* 172 */ #define getUserByMask ((struct UserNode * (*)(const char *))global[172]) +/* 173 */ #define countUsersWithHost ((int (*)(char *))global[173]) +/* 174 */ #define getAuthFakehost ((char * (*)(char *))global[174]) +/* 175 */ #define searchUserByNick ((struct UserNode * (*)(const char *))global[175]) +/* 176 */ #define getAllUsers ((struct UserNode * (*)(struct UserNode *))global[176]) +/* 177 */ #define getUsersWithAuth ((struct UserNode * (*)(const char *, struct UserNode *))global[177]) +/* 178 */ #define getUserCount ((int (*)(void))global[178]) +/* 179 */ #define get_userlist ((void (*)(struct ChanNode *, int, userlist_callback_t, void *))global[179]) +/* 180 */ #define _get_userlist_with_invisible ((void (*)(struct ChanNode *, int, userlist_callback_t, void *, int))global[180]) +/* 181 */ #define get_userauth ((void (*)(struct UserNode *, int, userauth_callback_t, void *))global[181]) +/* 182 */ #define compilation ((const char *) *global[182]) +/* 183 */ #define creation ((const char *) *global[183]) +/* 184 */ #define revision ((const char *) *global[184]) +/* 185 */ #define codelines ((const char *) *global[185]) +/* 186 */ #define patchlevel ((const int) *global[186]) + +#define MODULE_HEADER(initfunc,startfunc,loopfunc,stopfunc) \ + void **global = NULL; \ + int module_id = 0; \ + int init_module(void **functions, int modid) { \ + global = functions; \ + module_id = modid; \ + return initfunc(data); \ + } \ + void start_module(int type) { \ + startfunc(type); \ + } \ + void loop_module() { \ + loopfunc(); \ + } \ + void stop_module(int type) { \ + stopfunc(type); \ + } \ + int modversion() { \ + return MODULE_VERSION; \ + } + +#endif \ No newline at end of file diff --git a/src/mysqlConn.c b/src/mysqlConn.c index 3c2bcbe..41f0495 100644 --- a/src/mysqlConn.c +++ b/src/mysqlConn.c @@ -18,6 +18,8 @@ #include "mysqlConn.h" #define DATABASE_VERSION "15" +static void show_mysql_error(); + struct mysql_conn_struct { unsigned int tid; MYSQL *mysql_conn; @@ -46,7 +48,7 @@ static char *mysql_host, *mysql_user, *mysql_pass, *mysql_base; static pthread_mutex_t synchronized; #endif -void check_mysql() { +static void check_mysql() { MYSQL *mysql_conn = get_mysql_conn(); int errid; if((errid = mysql_ping(mysql_conn))) { @@ -200,7 +202,7 @@ void free_mysql() { mysql_conns = NULL; } -void show_mysql_error() { +static void show_mysql_error() { MYSQL *mysql_conn = get_mysql_conn(); //show mysql_error() putlog(LOGLEVEL_ERROR, "MySQL Error: %s\n", mysql_error(mysql_conn)); diff --git a/src/mysqlConn.h b/src/mysqlConn.h index 3af13c2..410f346 100644 --- a/src/mysqlConn.h +++ b/src/mysqlConn.h @@ -23,15 +23,14 @@ #define MYSQLMAXLEN 1024 -void check_mysql(); -MYSQL_RES *mysql_use(); -void mysql_free(); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ MYSQL_RES *mysql_use(); +/* MODULAR ACCESSIBLE */ void mysql_free(); void init_mysql(char *host, int port, char *user, char *pass, char *base); void free_mysql(); -void show_mysql_error(); -void printf_mysql_query(const char *text, ...) PRINTF_LIKE(1, 2); -void printf_long_mysql_query(int len, const char *text, ...) PRINTF_LIKE(2, 3); -char* escape_string(const char *str); -MYSQL *get_mysql_conn(); - -#endif \ No newline at end of file +/* MODULAR ACCESSIBLE */ void printf_mysql_query(const char *text, ...) PRINTF_LIKE(1, 2); +/* MODULAR ACCESSIBLE */ void printf_long_mysql_query(int len, const char *text, ...) PRINTF_LIKE(2, 3); +/* MODULAR ACCESSIBLE */ char* escape_string(const char *str); +/* MODULAR ACCESSIBLE */ MYSQL *get_mysql_conn(); +#endif +#endif diff --git a/src/overall.h b/src/overall.h new file mode 100644 index 0000000..8f167e9 --- /dev/null +++ b/src/overall.h @@ -0,0 +1,159 @@ +/* overall.h - NeonServ v5.3 + * Copyright (C) 2011-2012 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 _overall_h +#define _overall_h +#include "../config.h" + +#define NEONSERV_VERSION "5.3" +#define VERSION_PATCHLEVEL 543 + +#include +#include +#include +#include +#ifdef WIN32 +#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#include +#include +#endif +#include +#include +#include +#include +#include +#ifdef HAVE_THREADS +#include +#ifdef WIN32 +#define pthread_self_tid() pthread_self().p +#else +#define pthread_self_tid() pthread_self() +#endif +#define THREAD_MUTEX_INIT(var) { \ + pthread_mutexattr_t mutex_attr; \ + pthread_mutexattr_init(&mutex_attr);\ + pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE_NP);\ + pthread_mutex_init(&var, &mutex_attr); \ +} +#define THREAD_MUTEX_INIT_TYPE(var, type) { \ + pthread_mutexattr_t mutex_attr; \ + pthread_mutexattr_init(&mutex_attr);\ + pthread_mutexattr_settype(&mutex_attr, type);\ + pthread_mutex_init(&var, &mutex_attr); \ +} +#define SYNCHRONIZE(var) pthread_mutex_lock(&var) +#define SET_SYNCHRONIZE(var) pthread_mutex_trylock(&var) +#define DESYNCHRONIZE(var) pthread_mutex_unlock(&var) +#else +#define THREAD_MUTEX_INIT(var) +#define SYNCHRONIZE(var) +#define DESYNCHRONIZE(var) +#endif + +#if __GNUC__ +#define PRINTF_LIKE(M,N) __attribute__((format (printf, M, N))) +#else +#define PRINTF_LIKE(M,N) +#endif + +#if __GNUC__ >= 2 +#define UNUSED_ARG(ARG) ARG __attribute__((unused)) +#elif defined(S_SPLINT_S) +#define UNUSED_ARG(ARG) /*@unused@*/ ARG +#define const /*@observer@*/ /*@temp@*/ +#else +#define UNUSED_ARG(ARG) ARG +#endif + +#define STRINGIFY_(x) #x +#define STRINGIFY(x) STRINGIFY_(x) + +#if defined(__GNUC__) +#if defined(__GNUC_PATCHLEVEL__) +#define COMPILER "GCC" " " STRINGIFY(__GNUC__) "." STRINGIFY(__GNUC_MINOR__) "." STRINGIFY(__GNUC_PATCHLEVEL__) +#else +#define COMPILER "GCC" " " STRINGIFY(__GNUC__) "." STRINGIFY(__GNUC_MINOR__) +#endif +#elif defined (__IMAGECRAFT__) +#define COMPILER "ICCAVR" +#else +#define COMPILER "Unknown" +#endif + +#ifdef ENABLE_MEMORY_DEBUG +#include "memoryDebug.h" +#endif + +#define PID_FILE "neonserv.pid" +#define CONF_FILE "neonserv.conf" +#define LOG_FILE "neonserv.log" + +#define SOCKET_SELECT_TIME 1 +#define SOCKET_RECONNECT_TIME 20 + +#define NICKLEN 30 +#define USERLEN 10 +#define AUTHLEN 32 +#define HOSTLEN 63 +#define REALLEN 50 +#define TOPICLEN 500 +#define CHANNELLEN 200 +#define MAXLEN 512 +#define MAXLOGLEN 1024 +#define TRIGGERLEN 50 +#define MAXNUMPARAMS 200 /* maximum number of parameters in one line */ +#define MAXLANGUAGES 5 +#define MAXMODES 6 +#define INVITE_TIMEOUT 30 +#define BOTWAR_DETECTION_TIME 7 +#define BOTWAR_DETECTION_EVENTS 6 +#define REWHO_TIMEOUT 10 /* wait 10 seconds before WHO an unauthed user again */ +#define TICKS_PER_SECOND 10 + +//valid nick chars +#define VALID_NICK_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890{|}~[\\]^-_`" +//the first char is a little bit different +// 0 1 2 3 4 5 6 +// 1234567890123456789012345678901234567890123456789012345678 9012 62 +#define VALID_NICK_CHARS_FIRST "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~[\\]^_`" +#define VALID_NICK_CHARS_FIRST_LEN 62 + +#define TEMPUSER_LIST_INDEX VALID_NICK_CHARS_FIRST_LEN + +#define LOGLEVEL_INFO 0x01 +#define LOGLEVEL_ERROR 0x02 +#define LOGLEVEL_RAW 0x04 +#define LOGLEVEL_MYSQL 0x08 + +#define timeval_is_bigger(x,y) ((x.tv_sec > y.tv_sec) || (x.tv_sec == y.tv_sec && x.tv_usec > y.tv_usec)) + +#define perror(errmsg) (putlog(LOGLEVEL_ERROR, "ERROR (%s:%d) %s", __FILE__, __LINE__, errmsg)) + +#define MODSTATE_RELOAD 0x01 +#define MODSTATE_STARTSTOP 0x02 +#define MODSTATE_REBIND 0x03 + +#endif diff --git a/src/timeq.c b/src/timeq.c index 41e4b1a..4b30285 100644 --- a/src/timeq.c +++ b/src/timeq.c @@ -44,11 +44,11 @@ void timeq_tick() { DESYNCHRONIZE(synchronized); } -struct timeq_entry* timeq_add(int seconds, timeq_callback_t *callback, void *data) { - return timeq_uadd(seconds * 1000, callback, data); +struct timeq_entry* timeq_add(int seconds, int module_id, timeq_callback_t *callback, void *data) { + return timeq_uadd(seconds * 1000, module_id, callback, data); } -struct timeq_entry* timeq_uadd(int useconds, timeq_callback_t *callback, void *data) { +struct timeq_entry* timeq_uadd(int useconds, int module_id, timeq_callback_t *callback, void *data) { struct timeval now; gettimeofday(&now, NULL); struct timeq_entry *entry = malloc(sizeof(*entry)); @@ -61,6 +61,7 @@ struct timeq_entry* timeq_uadd(int useconds, timeq_callback_t *callback, void *d now.tv_usec += (useconds % 1000); now.tv_sec += (useconds / 1000); entry->execute = now; + entry->module_id = module_id; entry->callback = callback; entry->data = data; entry->name = NULL; @@ -82,13 +83,13 @@ struct timeq_entry* timeq_uadd(int useconds, timeq_callback_t *callback, void *d return entry; } -struct timeq_entry* timeq_add_name(char *name, int seconds, timeq_callback_t *callback, void *data) { - return timeq_uadd_name(name, seconds * 1000, callback, data); +struct timeq_entry* timeq_add_name(char *name, int seconds, int module_id, timeq_callback_t *callback, void *data) { + return timeq_uadd_name(name, seconds * 1000, module_id, callback, data); } -struct timeq_entry* timeq_uadd_name(char *name, int useconds, timeq_callback_t *callback, void *data) { +struct timeq_entry* timeq_uadd_name(char *name, int useconds, int module_id, timeq_callback_t *callback, void *data) { SYNCHRONIZE(synchronized); - struct timeq_entry *entry = timeq_uadd(useconds, callback, data); + struct timeq_entry *entry = timeq_uadd(useconds, module_id, callback, data); entry->name = strdup(name); DESYNCHRONIZE(synchronized); return entry; @@ -149,3 +150,21 @@ int timeq_name_exists(char *name) { DESYNCHRONIZE(synchronized); return 0; } + +void unregister_module_timers(int module_id) { + SYNCHRONIZE(synchronized); + struct timeq_entry *centry, *next, *last = NULL; + for(centry = timeq_events; centry; centry = next) { + next = centry->next; + if(centry->module_id == module_id) { + if(last) + last->next = centry->next; + else + timeq_events = centry->next; + free(centry->name); + free(centry); + } else + last = centry; + } + DESYNCHRONIZE(synchronized); +} diff --git a/src/timeq.h b/src/timeq.h index 4e943b7..f5a65d4 100644 --- a/src/timeq.h +++ b/src/timeq.h @@ -24,6 +24,7 @@ typedef TIMEQ_CALLBACK(timeq_callback_t); struct timeq_entry { char *name; + int module_id; struct timeval execute; timeq_callback_t *callback; void *data; @@ -31,14 +32,16 @@ struct timeq_entry { struct timeq_entry *next; }; +#ifndef DND_FUNCTIONS void init_timeq(); void timeq_tick(); -struct timeq_entry* timeq_add(int seconds, timeq_callback_t *callback, void *data); -struct timeq_entry* timeq_uadd(int useconds, timeq_callback_t *callback, void *data); -struct timeq_entry* timeq_add_name(char *name, int seconds, timeq_callback_t *callback, void *data); -struct timeq_entry* timeq_uadd_name(char *name, int useconds, timeq_callback_t *callback, void *data); -int timeq_del(struct timeq_entry* entry); -int timeq_del_name(char *name); -int timeq_name_exists(char *name); - -#endif \ No newline at end of file +/* MODULAR ACCESSIBLE */ struct timeq_entry* timeq_add(int seconds, int module_id, timeq_callback_t *callback, void *data); +/* MODULAR ACCESSIBLE */ struct timeq_entry* timeq_uadd(int useconds, int module_id, timeq_callback_t *callback, void *data); +/* MODULAR ACCESSIBLE */ struct timeq_entry* timeq_add_name(char *name, int seconds, int module_id, timeq_callback_t *callback, void *data); +/* MODULAR ACCESSIBLE */ struct timeq_entry* timeq_uadd_name(char *name, int useconds, int module_id, timeq_callback_t *callback, void *data); +/* MODULAR ACCESSIBLE */ int timeq_del(struct timeq_entry* entry); +/* MODULAR ACCESSIBLE */ int timeq_del_name(char *name); +/* MODULAR ACCESSIBLE */ int timeq_name_exists(char *name); +void unregister_module_timers(int module_id); +#endif +#endif diff --git a/src/tools.h b/src/tools.h index 7be2e0d..6a37f6b 100644 --- a/src/tools.h +++ b/src/tools.h @@ -51,20 +51,6 @@ struct ModeBuffer { int delCount; }; -int match(const char *mask, const char *name); - -struct Table *table_init(int width, int length, int flags); -int table_add(struct Table *table, char **entry); -int table_change(struct Table *table, int row, char **entry); -int table_change_field(struct Table *table, int row, int col, char *entry); -int table_set_bold(struct Table *table, int collum, int bold); -char **table_end(struct Table *table); -void table_free(struct Table *table); - -char* timeToStr(struct UserNode *user, int seconds, int items, char *buf); -int strToTime(struct UserNode *user, char *str); - -struct ModeBuffer* initModeBuffer(struct ClientSocket *client, struct ChanNode *chan); #define modeBufferSimpleMode(MODEBUF,ADD,MODE) modeBufferSet(MODEBUF, ADD, MODE, NULL) #define modeBufferOp(MODEBUF,USER) modeBufferSet(MODEBUF, 1, 'o', USER) #define modeBufferDeop(MODEBUF,USER) modeBufferSet(MODEBUF, 0, 'o', USER) @@ -74,20 +60,37 @@ struct ModeBuffer* initModeBuffer(struct ClientSocket *client, struct ChanNode * #define modeBufferDevoice(MODEBUF,USER) modeBufferSet(MODEBUF, 0, 'v', USER) #define modeBufferBan(MODEBUF,MASK) modeBufferSet(MODEBUF, 1, 'b', MASK) #define modeBufferUnban(MODEBUF,MASK) modeBufferSet(MODEBUF, 0, 'b', MASK) -void modeBufferSet(struct ModeBuffer *modeBuf, int add, char mode, char *param); -void flushModeBuffer(struct ModeBuffer *modeBuf); -void freeModeBuffer(struct ModeBuffer *modeBuf); -int is_ircmask(const char *text); +#ifndef DND_FUNCTIONS +/* MODULAR ACCESSIBLE */ int match(const char *mask, const char *name); + +/* MODULAR ACCESSIBLE */ struct Table *table_init(int width, int length, int flags); +/* MODULAR ACCESSIBLE */ int table_add(struct Table *table, char **entry); +/* MODULAR ACCESSIBLE */ int table_change(struct Table *table, int row, char **entry); +/* MODULAR ACCESSIBLE */ int table_change_field(struct Table *table, int row, int col, char *entry); +/* MODULAR ACCESSIBLE */ int table_set_bold(struct Table *table, int collum, int bold); +/* MODULAR ACCESSIBLE */ char **table_end(struct Table *table); +/* MODULAR ACCESSIBLE */ void table_free(struct Table *table); + +/* MODULAR ACCESSIBLE */ char* timeToStr(struct UserNode *user, int seconds, int items, char *buf); +/* MODULAR ACCESSIBLE */ int strToTime(struct UserNode *user, char *str); + +/* MODULAR ACCESSIBLE */ struct ModeBuffer* initModeBuffer(struct ClientSocket *client, struct ChanNode *chan); +/* MODULAR ACCESSIBLE */ void modeBufferSet(struct ModeBuffer *modeBuf, int add, char mode, char *param); +/* MODULAR ACCESSIBLE */ void flushModeBuffer(struct ModeBuffer *modeBuf); +/* MODULAR ACCESSIBLE */ void freeModeBuffer(struct ModeBuffer *modeBuf); + +/* MODULAR ACCESSIBLE */ int is_ircmask(const char *text); -char* generate_banmask(struct UserNode *user, char *buffer); -char* make_banmask(char *input, char* buffer); -int isFakeHost(char *host); +/* MODULAR ACCESSIBLE */ char* generate_banmask(struct UserNode *user, char *buffer); +/* MODULAR ACCESSIBLE */ char* make_banmask(char *input, char* buffer); +/* MODULAR ACCESSIBLE */ int isFakeHost(char *host); -int mask_match(char *mask, struct UserNode *user); +/* MODULAR ACCESSIBLE */ int mask_match(char *mask, struct UserNode *user); -unsigned long crc32(const char *text); +/* MODULAR ACCESSIBLE */ unsigned long crc32(const char *text); void init_tools(); -#endif \ No newline at end of file +#endif +#endif diff --git a/src/version.h b/src/version.h index 1248409..8784d08 100644 --- a/src/version.h +++ b/src/version.h @@ -19,10 +19,13 @@ #include "main.h" +#define MODULE_VERSION 1 + +#ifndef DND_FUNCTIONS extern const char *compilation; extern const char *creation; extern const char *revision; extern const char *codelines; extern const int patchlevel; - -#endif \ No newline at end of file +#endif +#endif -- 2.20.1