/* a new user is connecting, we need to trigger the ON_CONNECT events */ static void ev_uevents_new_user(IRC_User* u, void *s) { char **row; char* mask = irc_UserMask(u); char* maskp = irc_UserMaskP(u); int i; for(i = 0; i < event_index_size[ON_CONNECT]; ++i) { row = dbmem_row_at(dbm_uevents, event_index[ON_CONNECT][i]); if((row[4] == NULL) || (row[4] && (match(row[4], mask) || match(row[4], maskp)))) { /* do the action here */ action_types[atoi(row[5])].action(u, row[6]); } } }
static void ev_os_uevent_nick_register(IRC_User *u, u_int32_t *snid) { char **row; char* mask = irc_UserMask(u); char* maskp = irc_UserMaskP(u); int i; for(i = 0; i < event_index_size[ON_REGISTER]; ++i) { row = dbmem_row_at(dbm_uevents, event_index[ON_REGISTER][i]); if((row[4] == NULL) || (row[4] && (match(row[4], mask) || match(row[4], maskp)))) { /* do the action here */ action_types[atoi(row[5])].action(u, row[6]); } } }
/** internal functions implementation starts here **/ void ms_send(IRC_User *s, IRC_User *u) { u_int32_t source_snid; u_int32_t snid; u_int32_t id; char* target; char* message; int mcount = 0; int maxmemos; int bquota; u_int32_t flags; u_int32_t memo_flags = 0; /* status validation */ CHECK_IF_IDENTIFIED_NICK target = strtok(NULL, " "); message = strtok(NULL, ""); if(target && (snid = nick2snid(target)) == 0) { send_lang(u, s, NICK_X_NOT_REGISTERED, target); return; } /* we need to read memo options first */ memoserv_get_options(snid, &maxmemos, &bquota, &flags); if(flags && MOFL_AUTOSAVE) memo_flags = MFL_SAVED; if(NickSecurityCode && !IsAuthenticated(u)) send_lang(u, s, NEEDS_AUTH_NICK); else /* syntax validation */ if(IsNull(target) || IsNull(message)) send_lang(u, s, SEND_SYNTAX); /* check maxmemos */ else if(flags & MOFL_NOMEMOS) send_lang(u, s, MS_SEND_NOMEMOS); else if((mcount = memos_count(snid)) >= maxmemos) send_lang(u, s, MAX_MEMOS_REACHED_X_X, target, maxmemos); #if 0 /* check buddy quota for non buddies */ else if(is_buddy && (maxmemos-mcount <= bquota) && !is_buddy(snid, source_snid)) send_lang(u, s, MAX_MEMOS_REACHED_X_X, target, maxmemos-bquota); #endif /* execute operation */ else if((id = insert_memo(u->nick, source_snid, snid, message, memo_flags)) > 0) { IRC_User* tu; send_lang(u, s, SENT_MEMO_TO_X, target); tu = irc_FindUser(target); if(tu && tu->snid) /* target is online and identified */ { char memoprev[MEMOPREVMAX+1]; snprintf(memoprev, MEMOPREVMAX, "%s", message); send_lang(tu, s, YOU_GOT_MEMO_FROM_X_X_NUM_X, u->nick, memoprev, id); } if(flags & MOFL_FORWARD) { MYSQL_RES *res; MYSQL_ROW row; res = sql_query("SELECT email, lang FROM nickserv WHERE snid=%d", snid); if(res && (row = sql_next_row(res))) { char* email = row[0]; int lang = atoi(row[1]); email_init_symbols(); email_add_symbol("nick",target); email_add_symbol("email", email); email_add_symbol("message", message); email_add_symbol("subject", lang_str_l(lang, MS_SEND_SUBJECT_X, u->nick)); if(email_send(forward_email) < 0) { log_log(ms_log, mod_info.name, "Error sending forward email to %s by %s", email, irc_UserMask(u)); } } sql_free(res); } } else send_lang(u, s, UPDATE_FAIL); }