int route_info_message(struct hub_info* hub, struct hub_user* u) { if (!user_is_nat_override(u)) { return route_to_all(hub, u->info); } else { struct adc_message* cmd = adc_msg_copy(u->info); const char* address = user_get_address(u); struct hub_user* user = 0; adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV4_ADDR); adc_msg_add_named_argument(cmd, ADC_INF_FLAG_IPV4_ADDR, address); user = (struct hub_user*) list_get_first(hub->users->list); while (user) { if (user_is_nat_override(user)) route_to_user(hub, user, cmd); else route_to_user(hub, user, u->info); user = (struct hub_user*) list_get_next(hub->users->list); } adc_msg_free(cmd); } return 0; }
void uman_send_quit_message(struct hub_info* hub, struct hub_user* leaving) { struct adc_message* command = adc_msg_construct(ADC_CMD_IQUI, 6); adc_msg_add_argument(command, (const char*) sid_to_string(leaving->id.sid)); if (leaving->quit_reason == quit_banned || leaving->quit_reason == quit_kicked) { adc_msg_add_argument(command, ADC_QUI_FLAG_DISCONNECT); } route_to_all(hub, command); adc_msg_free(command); }
int route_message(struct hub_info* hub, struct hub_user* u, struct adc_message* msg) { struct hub_user* target = NULL; switch (msg->cache[0]) { case 'B': /* Broadcast to all logged in clients */ route_to_all(hub, msg); break; case 'D': target = uman_get_user_by_sid(hub->users, msg->target); if (target) { route_to_user(hub, target, msg); } break; case 'E': target = uman_get_user_by_sid(hub->users, msg->target); if (target) { route_to_user(hub, target, msg); route_to_user(hub, u, msg); } break; case 'F': route_to_subscribers(hub, msg); break; default: /* Ignore the message */ break; } return 0; }