int Server::remove_user_from_channel(const uint32_t user_id, const uint16_t channel_id) { Channel *chan = find_channel(channel_id); if (chan) { for (int x = 0; x < chan->n_members; ++x) { if (chan->members[x].id == user_id) { char msg[1000]; snprintf(msg, sizeof(msg), "%s left the channel.", chan->members[x].ptr->get_name()); chan->members[x] = chan->members[chan->n_members-1]; chan->n_members--; unsigned char remuser[1+sizeof(chat_user)]; chat_user update; update.user_id = user_id; update.channel = channel_id; msg_channel(msg, strlen(msg)+1, 0, channel_id); remuser[0] = SERVER_MESSAGE_CHANNEL_REMOVE_USER; memcpy(&remuser[1], &update, sizeof(update)); for (int y = 0; y < chan->n_members; ++y) { chan->members[y].ptr->send_raw(remuser, 1+sizeof(update)); } return 1; } } } return 0; }
/* * inputs - flag privmsg or notice * - pointer to command "PRIVMSG" or "NOTICE" * - pointer to client_p * - pointer to source_p * - pointer to channel */ static void m_message(int p_or_n, char *command, struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { int i; if (parc < 2 || *parv[1] == '\0') { if (p_or_n != NOTICE) sendto_one(source_p, form_str(source_p,ERR_NORECIPIENT), me.name, source_p->name, command); return; } if (parc < 3 || *parv[2] == '\0') { if (p_or_n != NOTICE) sendto_one(source_p, form_str(source_p,ERR_NOTEXTTOSEND), me.name, source_p->name); return; } /* Finish the flood grace period... */ if(MyClient(source_p) && !IsFloodDone(source_p)) flood_endgrace(source_p); if (build_target_list(p_or_n, command, client_p, source_p, parv[1], parv[2]) < 0) { /* Sigh. We need to relay this command to the hub */ if (!ServerInfo.hub && (uplink != NULL)) sendto_one(uplink, ":%s %s %s :%s", source_p->name, command, parv[1], parv[2]); return; } for (i = 0; i < ntargets; i++) { switch (targets[i].type) { case ENTITY_CHANNEL: msg_channel(p_or_n, command, client_p, source_p, (struct Channel *)targets[i].ptr, parv[2]); break; case ENTITY_CHANOPS_ON_CHANNEL: msg_channel_flags(p_or_n, command, client_p, source_p, (struct Channel *)targets[i].ptr, targets[i].flags, parv[2]); break; case ENTITY_CLIENT: msg_client(p_or_n, command, source_p, (struct Client *)targets[i].ptr, parv[2]); break; } } }
/* * inputs - flag privmsg or notice * - pointer to command "PRIVMSG" or "NOTICE" * - pointer to source_p * - pointer to channel */ static void m_message(int p_or_n, const char *command, struct Client *source_p, int parc, char *parv[]) { if (parc < 2 || EmptyString(parv[1])) { if (p_or_n != NOTICE) sendto_one_numeric(source_p, &me, ERR_NORECIPIENT, command); return; } if (parc < 3 || EmptyString(parv[2])) { if (p_or_n != NOTICE) sendto_one_numeric(source_p, &me, ERR_NOTEXTTOSEND); return; } /* Finish the flood grace period... */ if (MyClient(source_p) && !IsFloodDone(source_p)) flood_endgrace(source_p); if (build_target_list(p_or_n, command, source_p, parv[1], parv[2]) < 0) return; for (unsigned int i = 0; i < ntargets; ++i) { switch (targets[i].type) { case ENTITY_CLIENT: msg_client(p_or_n, command, source_p, targets[i].ptr, parv[2]); break; case ENTITY_CHANNEL: msg_channel(p_or_n, command, source_p, targets[i].ptr, parv[2]); break; case ENTITY_CHANOPS_ON_CHANNEL: msg_channel_flags(p_or_n, command, source_p, targets[i].ptr, targets[i].flags, parv[2]); break; } } }
/* * inputs - flag privmsg or notice * - pointer to command "PRIVMSG" or "NOTICE" * - pointer to client_p * - pointer to source_p * - pointer to channel */ static void m_message(int p_or_n, const char *command, struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { int i; if(parc < 2 || EmptyString(parv[1])) { if(p_or_n != NOTICE) sendto_one(source_p, form_str(ERR_NORECIPIENT), ID_or_name(&me, client_p), ID_or_name(source_p, client_p), command); return; } if(parc < 3 || EmptyString(parv[2])) { if(p_or_n != NOTICE) sendto_one(source_p, form_str(ERR_NOTEXTTOSEND), ID_or_name(&me, client_p), ID_or_name(source_p, client_p)); return; } /* Finish the flood grace period... */ if(MyClient(source_p) && !IsFloodDone(source_p)) #if 0 &&irccmp(source_p->name, parv[1]) != 0) /* some dumb clients msg/notice themself to determine lag to the server BEFORE sending JOIN commands, and then flood off because they left gracemode. -wiz */ /* * Not our problem if they do this. -Michael */ #endif flood_endgrace(source_p); if(build_target_list(p_or_n, command, client_p, source_p, parv[1], parv[2]) < 0) { /* Sigh. We need to relay this command to the hub */ if(!ServerInfo.hub && (uplink != NULL)) sendto_one(uplink, ":%s %s %s :%s", source_p->name, command, parv[1], parv[2]); return; } for(i = 0; i < ntargets; i++) { switch (targets[i].type) { case ENTITY_CHANNEL: msg_channel(p_or_n, command, client_p, source_p, (struct Channel *) targets[i].ptr, parv[2]); break; case ENTITY_CHANOPS_ON_CHANNEL: msg_channel_flags(p_or_n, command, client_p, source_p, (struct Channel *) targets[i].ptr, targets[i].flags, parv[2]); break; case ENTITY_CLIENT: msg_client(p_or_n, command, source_p, (struct Client *) targets[i].ptr, parv[2]); break; } } }