X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/cf33840c9fe630c06e72b176eda260a95f756733..63c0b8ad3980b46f5c9052c1966a36ce15f6e440:/src/mod-memoserv.c diff --git a/src/mod-memoserv.c b/src/mod-memoserv.c index 2c6e638..84880c2 100644 --- a/src/mod-memoserv.c +++ b/src/mod-memoserv.c @@ -6,7 +6,7 @@ * * x3 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 2 of the License, or + * 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, @@ -44,6 +44,7 @@ #include "nickserv.h" #include "opserv.h" #include "saxdb.h" +#include "mail.h" #include "timeq.h" #define KEY_MAIN_ACCOUNTS "accounts" @@ -111,6 +112,9 @@ static const struct message_entry msgtab[] = { { "MSMSG_LIST_END", "--------------End of Memos--------------" }, { "MSMSG_BAR", "----------------------------------------"}, + { "MSEMAIL_NEWMEMO_SUBJECT", "New %s %s message from %s" }, + { "MSEMAIL_NEWMEMO_BODY", "This email has been sent to let you know that %s has sent you a message via %s.\n\n The message is: %s.\n\nTo delete this message just type in /msg %s delete %d when on %s next." }, + { "MSMSG_DEFCON_NO_NEW_MEMOS", "You cannot send new memos at this time, please try again soon." }, { NULL, NULL } @@ -143,9 +147,9 @@ struct userNode *memoserv; return 0; } DECLARE_LIST(memoList, struct memo*); -DEFINE_LIST(memoList, struct memo*); +DEFINE_LIST(memoList, struct memo*) DECLARE_LIST(historyList, struct history*); -DEFINE_LIST(historyList, struct history*); +DEFINE_LIST(historyList, struct history*) /* memo_account.flags fields */ #define MEMO_NOTIFY_NEW 0x00000001 @@ -181,7 +185,9 @@ extern struct string_list *autojoin_channels; const char *memoserv_module_deps[] = { NULL }; static struct module *memoserv_module; static struct log_type *MS_LOG; -static unsigned long memosSent, memosExpired; +static unsigned long memoCount; +static unsigned long memosSent; +static unsigned long memosExpired; static struct dict *memos; /* memo_account->handle->handle -> memo_account */ static struct dict *historys; static dict_t memoserv_opt_dict; /* contains option_func_t* */ @@ -213,6 +219,7 @@ delete_memo(struct memo *memo) memoList_remove(&memo->sender->sent, memo); free(memo->message); free(memo); + memoCount--; } static void @@ -249,10 +256,10 @@ do_expire(void) { dict_iterator_t it; for (it = dict_first(memos); it; it = iter_next(it)) { - struct memo_account *acct = iter_data(it); + struct memo_account *account = iter_data(it); unsigned int ii; - for (ii = 0; ii < acct->sent.used; ++ii) { - struct memo *memo = acct->sent.list[ii]; + for (ii = 0; ii < account->sent.used; ++ii) { + struct memo *memo = account->sent.list[ii]; if ((now - memo->sent) > memoserv_conf.message_expiry) { delete_memo(memo); memosExpired++; @@ -262,10 +269,10 @@ do_expire(void) } for (it = dict_first(historys); it; it = iter_next(it)) { - struct memo_account *acct = iter_data(it); + struct memo_account *account = iter_data(it); unsigned int ii; - for (ii = 0; ii < acct->hsent.used; ++ii) { - struct history *history = acct->hsent.list[ii]; + for (ii = 0; ii < account->hsent.used; ++ii) { + struct history *history = account->hsent.list[ii]; if ((now - history->sent) > memoserv_conf.message_expiry) { delete_history(history); memosExpired++; @@ -326,6 +333,7 @@ add_memo(time_t sent, struct memo_account *recipient, struct memo_account *sende memo->sent = sent; memo->message = strdup(message); memosSent++; + memoCount++; if (nfrom_read) history = add_history(sent, recipient, sender, memo->id); @@ -356,7 +364,7 @@ memoserv_can_send(struct userNode *bot, struct userNode *user, struct memo_accou if (acct->handle->ignores->used) { for (i=0; i < acct->handle->ignores->used; i++) { - if (user_matches_glob(user, acct->handle->ignores->list[i], MATCH_USENICK)) { + if (user_matches_glob(user, acct->handle->ignores->list[i], MATCH_USENICK, 0)) { match = 1; break; } @@ -400,10 +408,13 @@ static struct memo *find_memo(struct userNode *user, struct svccmd *cmd, struct static MODCMD_FUNC(cmd_send) { char *message; - int reciept = 0, inc = 2; + int reciept = 0, inc = 2, email = 0; struct handle_info *hi; struct memo_account *ma, *sender; struct memo *memo; + char subject[128], body[4096]; + char *estr; + const char *netname, *fmt; MEMOSERV_MIN_PARAMS(3); @@ -456,6 +467,19 @@ static MODCMD_FUNC(cmd_send) send_message_type((ma->flags & MEMO_USE_PRIVMSG)? MSG_TYPE_PRIVMSG : MSG_TYPE_NOTICE, other, memoserv ? memoserv : cmd->parent->bot, "MSMSG_NEW_MESSAGE", user->nick); } + estr = conf_get_data("services/nickserv/email_enabled", RECDB_QSTRING); + netname = conf_get_data("server/network", RECDB_QSTRING); + email = atoi(estr); + if (email && (ma->flags & MEMO_NOTIFY_NEW)) { + fmt = handle_find_message(hi, "MSEMAIL_NEWMEMO_SUBJECT"); + snprintf(subject, sizeof(subject), fmt, netname, memoserv->nick, user->nick); + + fmt = handle_find_message(hi, "MSEMAIL_NEWMEMO_BODY"); + snprintf(body, sizeof(body), fmt, user->nick, memoserv->nick, message, memoserv->nick, memo_id, netname); + + mail_send(memoserv, hi, subject, body, 0); + } + reply("MSMSG_MEMO_SENT", ma->handle->handle, memo_id); return 1; } @@ -547,11 +571,6 @@ static MODCMD_FUNC(cmd_read) char posted[24]; struct tm tm; - if (!(ma = memoserv_get_account(user->handle_info))) - return 0; - if (!(memo = find_memo(user, cmd, ma, argv[1], &memoid))) - return 0; - if (argc > 2) { char *argtwo = argv[2]; while (*argtwo) { @@ -578,6 +597,12 @@ static MODCMD_FUNC(cmd_read) } } + if (!(ma = memoserv_get_account(user->handle_info))) + return 0; + + if (!(memo = find_memo(user, cmd, ma, argv[1], &memoid))) + return 0; + localtime_r(&memo->sent, &tm); strftime(posted, sizeof(posted), "%I:%M %p, %m/%d/%Y", &tm); @@ -757,7 +782,7 @@ static MODCMD_FUNC(cmd_oset) MEMOSERV_MIN_PARAMS(2); - if (!(hi = get_victim_oper(cmd, user, argv[1]))) + if (!(hi = get_victim_oper(user, argv[1]))) return 0; if (argc < 3) { @@ -955,7 +980,7 @@ static MODCMD_FUNC(cmd_status) } reply("MSMSG_STATUS_HIST_TOTAL", hc); - reply("MSMSG_STATUS_TOTAL", mc); + reply("MSMSG_STATUS_TOTAL", memoCount); reply("MSMSG_STATUS_EXPIRED", memosExpired); reply("MSMSG_STATUS_SENT", memosSent); return 1; @@ -1276,7 +1301,7 @@ memoserv_check_messages(struct userNode *user, UNUSED_ARG(struct handle_info *ol } static void -memoserv_rename_account(struct handle_info *hi, const char *old_handle) +memoserv_rename_account(struct handle_info *hi, const char *old_handle, UNUSED_ARG(void *extra)) { struct memo_account *ma; if (!(ma = dict_find(memos, old_handle, NULL))) @@ -1303,7 +1328,7 @@ memoserv_init(void) historys = dict_new(); dict_set_free_data(memos, delete_memo_account); reg_auth_func(memoserv_check_messages); - reg_handle_rename_func(memoserv_rename_account); + reg_handle_rename_func(memoserv_rename_account, NULL); reg_unreg_func(memoserv_unreg_account); conf_register_reload(memoserv_conf_read); reg_exit_func(memoserv_cleanup); @@ -1356,8 +1381,7 @@ memoserv_finalize(void) { if (str) { memoserv = memoserv_conf.bot; const char *modes = conf_get_data("modules/memoserv/modes", RECDB_QSTRING); - memoserv = AddService(str, modes ? modes : NULL, "User-User Memorandum Services", NULL); - + memoserv = AddLocalUser(str, str, NULL, "User-User Memorandum Services", modes); } else { log_module(MS_LOG, LOG_ERROR, "database_get_data for memoserv_conf.bot failed!"); exit(1);