X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/53b62ed9ccb30773412cee15c7882a552578a5d7..8536ac6b661fa261bad7de981045401f514fb6b7:/src/opserv.c diff --git a/src/opserv.c b/src/opserv.c index b71c94a..ba424c2 100644 --- a/src/opserv.c +++ b/src/opserv.c @@ -216,6 +216,7 @@ static const struct message_entry msgtab[] = { { "OSMSG_WHOIS_CHANNELS", "Channels : %s" }, { "OSMSG_WHOIS_HIDECHANS", "Channel list omitted for your sanity." }, { "OSMSG_WHOIS_VERSION", "Version : %s" }, + { "OSMSG_WHOIS_SSLFP", "SSL f/print : %s" }, { "OSMSG_WHOIS_MARK", "Mark : %s" }, { "OSMSG_WHOIS_NO_NOTICE", "No_notices : %s" }, { "OSMSG_UNBAN_DONE", "Ban(s) removed from channel %s." }, @@ -585,7 +586,9 @@ typedef enum { REACT_SVSJOIN, REACT_SVSPART, REACT_VERSION, - REACT_MARK + REACT_MARK, + REACT_NOTICEUSER, + REACT_MSGUSER } opserv_alert_reaction; struct opserv_user_alert { @@ -2167,31 +2170,17 @@ static MODCMD_FUNC(cmd_whois) if(target->version_reply) { reply("OSMSG_WHOIS_VERSION", target->version_reply); } + if(target->sslfp) { + reply("OSMSG_WHOIS_SSLFP", target->sslfp); + } if(target->mark) { reply("OSMSG_WHOIS_MARK", target->mark); } reply("OSMSG_WHOIS_NO_NOTICE", target->no_notice ? "YES":"NO"); if (target->modes) { - bpos = 0; + bpos = irc_user_modes(target, buffer, sizeof(buffer)); #define buffer_cat(str) (herelen = strlen(str), memcpy(buffer+bpos, str, herelen), bpos += herelen) - if (IsInvisible(target)) buffer[bpos++] = 'i'; - if (IsWallOp(target)) buffer[bpos++] = 'w'; - if (IsOper(target)) buffer[bpos++] = 'o'; - if (IsGlobal(target)) buffer[bpos++] = 'g'; - - // sethost - reed/apples - // if (IsHelperIrcu(target)) buffer[bpos++] = 'h'; - if (IsSetHost(target)) buffer[bpos++] = 'h'; - - if (IsService(target)) buffer[bpos++] = 'k'; - if (IsDeaf(target)) buffer[bpos++] = 'd'; - if (target->handle_info) buffer[bpos++] = 'r'; - if (IsHiddenHost(target)) buffer[bpos++] = 'x'; - if (IsBotM(target)) buffer[bpos++] = 'B'; - if (IsHideChans(target)) buffer[bpos++] = 'n'; - if (IsHideIdle(target)) buffer[bpos++] = 'I'; - if (IsXtraOp(target)) buffer[bpos++] = 'X'; if (IsGagged(target)) buffer_cat(" (gagged)"); if (IsRegistering(target)) buffer_cat(" (registered account)"); buffer[bpos] = 0; @@ -2545,6 +2534,8 @@ static MODCMD_FUNC(cmd_stats_alerts) { case REACT_SVSPART: reaction = "svspart"; break; case REACT_VERSION: reaction = "version"; break; case REACT_MARK: reaction = "mark"; break; + case REACT_NOTICEUSER: reaction = "noticeuser"; break; + case REACT_MSGUSER: reaction = "msguser"; break; default: reaction = ""; break; } reply("OSMSG_ALERT_IS", iter_key(it), reaction, alert->owner); @@ -2758,7 +2749,7 @@ opserv_part_channel(void *data) static int alert_check_user(const char *key, void *data, void *extra); static int -opserv_new_user_check(struct userNode *user) +opserv_new_user_check(struct userNode *user, UNUSED_ARG(void *extra)) { struct opserv_hostinfo *ohi; struct gag_entry *gag; @@ -2845,7 +2836,7 @@ opserv_new_user_check(struct userNode *user) } static void -opserv_user_cleanup(struct userNode *user, UNUSED_ARG(struct userNode *killer), UNUSED_ARG(const char *why)) +opserv_user_cleanup(struct userNode *user, UNUSED_ARG(struct userNode *killer), UNUSED_ARG(const char *why), UNUSED_ARG(void *extra)) { struct opserv_hostinfo *ohi; char addr[IRC_NTOP_MAX_SIZE]; @@ -2909,7 +2900,7 @@ opserv_shutdown_channel(struct chanNode *channel, const char *reason) } static void -opserv_channel_check(struct chanNode *newchan) +opserv_channel_check(struct chanNode *newchan, UNUSED_ARG(void *extra)) { /*char *warning; */ @@ -2928,7 +2919,7 @@ opserv_channel_check(struct chanNode *newchan) } static void -opserv_channel_delete(struct chanNode *chan) +opserv_channel_delete(struct chanNode *chan, UNUSED_ARG(void *extra)) { timeq_del(0, opserv_part_channel, chan, TIMEQ_IGNORE_WHEN); } @@ -2959,7 +2950,7 @@ opserv_notice_handler(struct userNode *user, struct userNode *bot, const char *t } static int -opserv_join_check(struct modeNode *mNode) +opserv_join_check(struct modeNode *mNode, UNUSED_ARG(void *extra)) { struct userNode *user = mNode->user; struct chanNode *channel = mNode->channel; @@ -4877,6 +4868,10 @@ add_user_alert(const char *key, void *data, UNUSED_ARG(void *extra)) reaction = REACT_VERSION; else if (!irccasecmp(react, "mark")) reaction = REACT_MARK; + else if (!irccasecmp(react, "noticeuser")) + reaction = REACT_NOTICEUSER; + else if (!irccasecmp(react, "msguser")) + reaction = REACT_MSGUSER; else { log_module(OS_LOG, LOG_ERROR, "Invalid reaction %s for alert %s.", react, key); return 0; @@ -5164,6 +5159,8 @@ opserv_saxdb_write(struct saxdb_context *ctx) case REACT_SVSPART: reaction = "svspart"; break; case REACT_VERSION: reaction = "version"; break; case REACT_MARK: reaction = "mark"; break; + case REACT_NOTICEUSER: reaction = "noticeuser"; break; + case REACT_MSGUSER: reaction = "msguser"; break; default: reaction = NULL; log_module(OS_LOG, LOG_ERROR, "Invalid reaction type %d for alert %s (while writing database).", alert->reaction, iter_key(it)); @@ -6797,18 +6794,24 @@ alert_check_user(const char *key, void *data, void *extra) add_track_user(user); #endif break; + case REACT_NOTICEUSER: + irc_notice_user(opserv, user, alert->discrim->reason); + break; + case REACT_MSGUSER: + irc_privmsg_user(opserv, user, alert->discrim->reason); + break; } return 0; } static void -opserv_alert_check_account(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle)) +opserv_alert_check_account(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle), UNUSED_ARG(void *extra)) { dict_foreach(opserv_account_based_alerts, alert_check_user, user); } static void -opserv_alert_check_nick(struct userNode *user, UNUSED_ARG(const char *old_nick)) +opserv_alert_check_nick(struct userNode *user, UNUSED_ARG(const char *old_nick), UNUSED_ARG(void *extra)) { struct gag_entry *gag; @@ -6825,7 +6828,7 @@ opserv_alert_check_nick(struct userNode *user, UNUSED_ARG(const char *old_nick)) } static void -opserv_staff_alert(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle)) +opserv_staff_alert(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle), UNUSED_ARG(void *extra)) { const char *type; @@ -6982,6 +6985,10 @@ static MODCMD_FUNC(cmd_addalert) reaction = REACT_VERSION; else if(!irccasecmp(argv[2], "mark")) reaction = REACT_MARK; + else if(!irccasecmp(argv[2], "noticeuser")) + reaction = REACT_NOTICEUSER; + else if(!irccasecmp(argv[2], "msguser")) + reaction = REACT_MSGUSER; else { reply("OSMSG_UNKNOWN_REACTION", argv[2]); return 0; @@ -7228,7 +7235,7 @@ opserv_db_init(void) { } static void -opserv_db_cleanup(void) +opserv_db_cleanup(UNUSED_ARG(void* extra)) { unsigned int nn; @@ -7237,7 +7244,7 @@ opserv_db_cleanup(void) free_string_list(opserv_bad_words); dict_delete(opserv_exempt_channels); dict_delete(opserv_trusted_hosts); - unreg_del_user_func(opserv_user_cleanup); + unreg_del_user_func(opserv_user_cleanup, NULL); dict_delete(opserv_hostinfo_dict); dict_delete(opserv_nick_based_alerts); dict_delete(opserv_account_based_alerts); @@ -7266,6 +7273,8 @@ init_opserv(const char *nick) opserv_define_func("ACCESS", cmd_access, 0, 0, 0); opserv_define_func("ADDALERT", cmd_addalert, 800, 0, 4); opserv_define_func("ADDALERT NOTICE", NULL, 0, 0, 0); + opserv_define_func("ADDALERT NOTICEUSER", NULL, 0, 0, 0); + opserv_define_func("ADDALERT MSGUSER", NULL, 0, 0, 0); opserv_define_func("ADDALERT SILENT", NULL, 900, 0, 0); opserv_define_func("ADDALERT GLINE", NULL, 900, 0, 0); opserv_define_func("ADDALERT SHUN", NULL, 900, 0, 0); @@ -7410,14 +7419,14 @@ init_opserv(const char *nick) opserv_waiting_connections = dict_new(); dict_set_free_data(opserv_waiting_connections, opserv_free_waiting_connection); - reg_new_user_func(opserv_new_user_check); - reg_nick_change_func(opserv_alert_check_nick); - reg_del_user_func(opserv_user_cleanup); - reg_new_channel_func(opserv_channel_check); - reg_del_channel_func(opserv_channel_delete); - reg_join_func(opserv_join_check); - reg_auth_func(opserv_staff_alert); - reg_auth_func(opserv_alert_check_account); + reg_new_user_func(opserv_new_user_check, NULL); + reg_nick_change_func(opserv_alert_check_nick, NULL); + reg_del_user_func(opserv_user_cleanup, NULL); + reg_new_channel_func(opserv_channel_check, NULL); + reg_del_channel_func(opserv_channel_delete, NULL); + reg_join_func(opserv_join_check, NULL); + reg_auth_func(opserv_staff_alert, NULL); + reg_auth_func(opserv_alert_check_account, NULL); reg_notice_func(opserv, opserv_notice_handler); opserv_db_init(); @@ -7435,6 +7444,6 @@ init_opserv(const char *nick) /* start the karma timer, using the saved one if available */ routing_karma_timer(dict_find(opserv_routing_plan_options, "KARMA_TIMER", NULL)); - reg_exit_func(opserv_db_cleanup); + reg_exit_func(opserv_db_cleanup, NULL); message_register_table(msgtab); }