/* * m_pseudo - generic service message handler * * parv[0] = sender prefix * parv[1] = service mapping (s_map * disguised as char *) * parv[2] = message */ int m_pseudo(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { char *text, buffer[BUFSIZE]; struct s_map *map; struct nick_host *nh; assert(0 != cptr); assert(cptr == sptr); assert(0 != cli_user(sptr)); /* By default, relay the message straight through. */ text = parv[parc - 1]; /* HACK! HACK! HACK! HACK! Yes. It's icky, but * it's the only way. */ map = (struct s_map *)parv[1]; assert(0 != map); if (parc < 3 || EmptyString(text)) { if (map->defaulttext) text = map->defaulttext; else return send_reply(sptr, ERR_NOTEXTTOSEND); } if (map->prepend) { ircd_snprintf(0, buffer, sizeof(buffer) - 1, "%s%s", map->prepend, text); buffer[sizeof(buffer) - 1] = 0; text = buffer; } for (nh = map->services; nh; nh = nh->next) { struct Client *target, *server; if (NULL == (server = FindServer(nh->nick + nh->nicklen + 1))) continue; nh->nick[nh->nicklen] = '\0'; if ((NULL == (target = FindUser(nh->nick))) || (server != cli_user(target)->server)) continue; nh->nick[nh->nicklen] = '@'; relay_directed_message(sptr, nh->nick, nh->nick + nh->nicklen, text); return 0; } return send_reply(sptr, ERR_SERVICESDOWN, map->name); }
/* * m_privmsg - generic message handler */ int m_privmsg(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { char* name; char* server; int i; int count; char* vector[MAXTARGETS]; assert(0 != cptr); assert(cptr == sptr); assert(0 != cli_user(sptr)); ClrFlag(sptr, FLAG_TS8); if (feature_bool(FEAT_IDLE_FROM_MSG)) cli_user(sptr)->last = CurrentTime; if (parc < 2 || EmptyString(parv[1])) return send_reply(sptr, ERR_NORECIPIENT, MSG_PRIVATE); if (parc < 3 || EmptyString(parv[parc - 1])) return send_reply(sptr, ERR_NOTEXTTOSEND); count = unique_name_vector(parv[1], ',', vector, MAXTARGETS); for (i = 0; i < count; ++i) { name = vector[i]; /* * channel msg? */ if (IsChannelPrefix(*name)) { relay_channel_message(sptr, name, parv[parc - 1]); } /* * we have to check for the '@' at least once no matter what we do * handle it first so we don't have to do it twice */ else if ((server = strchr(name, '@'))) relay_directed_message(sptr, name, server, parv[parc - 1]); else relay_private_message(sptr, name, parv[parc - 1]); } return 0; }
/* * ms_privmsg - server message handler */ int ms_privmsg(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { char* name; char* server; ClrFlag(sptr, FLAG_TS8); if (parc < 3) { /* * we can't deliver it, sending an error back is pointless */ return 0; } name = parv[1]; /* * channel msg? */ if (IsChannelPrefix(*name)) { server_relay_channel_message(sptr, name, parv[parc - 1]); } /* * coming from another server, we have to check this here */ else if ('$' == *name && IsOper(sptr)) { server_relay_masked_message(sptr, name, parv[parc - 1]); } else if ((server = strchr(name, '@'))) { /* * XXX - can't get away with not doing everything * relay_directed_message has to do */ relay_directed_message(sptr, name, server, parv[parc - 1]); } else { server_relay_private_message(sptr, name, parv[parc - 1]); } return 0; }