static void wd_cmd_say(wi_array_t *arguments) { wd_client_t *client = wd_client(); wi_array_t *array; wi_string_t *string; wd_chat_t *chat; wd_cid_t cid; unsigned int i, count; cid = wi_string_uint32(WI_ARRAY(arguments, 0)); chat = wd_chat_with_cid(cid); if(!chat) return; if(!wd_chat_contains_client(chat, client)) return; array = wi_string_components_separated_by_string(WI_ARRAY(arguments, 1), WI_STR("\n\r")); count = wi_array_count(array); wd_broadcast_lock(); for(i = 0; i < count; i++) { string = WI_ARRAY(array, i); if(wi_string_length(string) > 0) { wd_broadcast(cid, 300, WI_STR("%u%c%u%c%#@"), cid, WD_FIELD_SEPARATOR, client->uid, WD_FIELD_SEPARATOR, string); } } wd_broadcast_unlock(); }
static void wd_cmd_icon(wi_array_t *arguments) { wd_client_t *client = wd_client(); wd_icon_t icon; icon = wi_string_uint32(WI_ARRAY(arguments, 0)); /* set icon if changed */ if(client->icon != icon) { client->icon = icon; if(client->state == WD_CLIENT_STATE_LOGGED_IN) { wd_broadcast_lock(); wd_client_broadcast_status(client); wd_broadcast_unlock(); } } /* copy custom icon if changed */ if(wi_array_count(arguments) > 1) { wi_release(client->image); client->image = wi_retain(WI_ARRAY(arguments, 1)); if(client->state == WD_CLIENT_STATE_LOGGED_IN) { wd_broadcast_lock(); wd_broadcast(WD_PUBLIC_CID, 340, WI_STR("%u%c%#@"), client->uid, WD_FIELD_SEPARATOR, client->image); wd_broadcast_unlock(); } } }
void wd_user_broadcast_status(wd_user_t *user) { wd_broadcast(wd_public_chat, 304, WI_STR("%u%c%u%c%u%c%u%c%#@%c%#@"), wd_user_uid(user), WD_FIELD_SEPARATOR, wd_user_is_idle(user), WD_FIELD_SEPARATOR, wd_user_is_admin(user), WD_FIELD_SEPARATOR, wd_user_icon(user), WD_FIELD_SEPARATOR, wd_user_nick(user), WD_FIELD_SEPARATOR, wd_user_status(user)); }
static void wd_cmd_broadcast(wi_array_t *arguments) { wd_client_t *client = wd_client(); if(!client->account->broadcast) { wd_reply(516, WI_STR("Permission Denied")); return; } wd_broadcast_lock(); wd_broadcast(WD_PUBLIC_CID, 309, WI_STR("%u%c%#@"), client->uid, WD_FIELD_SEPARATOR, WI_ARRAY(arguments, 0)); wd_broadcast_unlock(); }
void wd_server_send_server_info(wi_boolean_t broadcast) { wi_string_t *string, *start_date; start_date = wi_date_rfc3339_string(wd_start_date); string = wi_string_with_format(WI_STR("%#@%c%#@%c%#@%c%#@%c%#@%c%u%c%llu"), wd_server_version_string, WD_FIELD_SEPARATOR, wd_protocol_version_string, WD_FIELD_SEPARATOR, wd_settings.name, WD_FIELD_SEPARATOR, wd_settings.description, WD_FIELD_SEPARATOR, start_date, WD_FIELD_SEPARATOR, wd_files_count, WD_FIELD_SEPARATOR, wd_files_size); if(broadcast) wd_broadcast(wd_public_chat, 200, WI_STR("%#@"), string); else wd_reply(200, WI_STR("%#@"), string); }
void wd_chat_broadcast_topic(wd_chat_t *chat) { wi_string_t *string; wd_topic_t *topic; topic = wd_chat_topic(chat); if(topic) { string = wi_date_rfc3339_string(topic->date); wd_broadcast(chat, 341, WI_STR("%u%c%#@%c%#@%c%#@%c%#@%c%#@"), chat->cid, WD_FIELD_SEPARATOR, topic->nick, WD_FIELD_SEPARATOR, topic->login, WD_FIELD_SEPARATOR, topic->ip, WD_FIELD_SEPARATOR, string, WD_FIELD_SEPARATOR, topic->topic); } }
void wd_chat_add_user_and_broadcast(wd_chat_t *chat, wd_user_t *user) { wd_broadcast(chat, 302, WI_STR("%u%c%u%c%u%c%u%c%u%c%#@%c%#@%c%#@%c%#@%c%#@%c%#@"), chat->cid, WD_FIELD_SEPARATOR, wd_user_uid(user), WD_FIELD_SEPARATOR, wd_user_is_idle(user), WD_FIELD_SEPARATOR, wd_user_is_admin(user), WD_FIELD_SEPARATOR, wd_user_icon(user), WD_FIELD_SEPARATOR, wd_user_nick(user), WD_FIELD_SEPARATOR, wd_user_login(user), WD_FIELD_SEPARATOR, wd_user_ip(user), WD_FIELD_SEPARATOR, wd_user_host(user), WD_FIELD_SEPARATOR, wd_user_status(user), WD_FIELD_SEPARATOR, wd_user_image(user)); wi_array_wrlock(chat->users); wi_mutable_array_add_data(chat->users, user); wi_array_unlock(chat->users); }
void wd_apply_config(void) { char start_time[WD_DATETIME_SIZE]; /* change directory to the files path */ if(strcmp(wd_settings.files, wd_previous_settings.files) != 0) { if(chdir(wd_settings.files) < 0) { wd_log(LOG_ERR, "Could not change directory to %s: %s", wd_settings.files, strerror(errno)); } } /* reload banner */ if(wd_banner) free(wd_banner); if(strlen(wd_settings.banner) > 0) wd_banner = wd_base64_encode(wd_settings.banner); /* reload server information */ if(strcmp(wd_settings.name, wd_previous_settings.name) != 0 || strcmp(wd_settings.description, wd_previous_settings.description) != 0) { /* format time string */ wd_time_to_iso8601(wd_start_time, start_time, sizeof(start_time)); /* reply a 200 */ wd_broadcast(WD_PUBLIC_CHAT, 200, "%s%c%s%c%s%c%s%c%s%c%u%c%llu", wd_version_string, WD_FIELD_SEPARATOR, WD_PROTOCOL_VERSION, WD_FIELD_SEPARATOR, wd_settings.name, WD_FIELD_SEPARATOR, wd_settings.description, WD_FIELD_SEPARATOR, start_time, WD_FIELD_SEPARATOR, wd_files_count, WD_FIELD_SEPARATOR, wd_files_size); } /* apply SSL config */ wd_apply_config_ssl(); }
static void wd_cmd_ban(wi_array_t *arguments) { wd_client_t *client = wd_client(); wd_client_t *peer; wd_uid_t uid; if(!client->account->ban_users) { wd_reply(516, WI_STR("Permission Denied")); return; } uid = wi_string_uint32(WI_ARRAY(arguments, 0)); peer = wd_client_with_uid(uid); if(!peer) { wd_reply(512, WI_STR("Client Not Found")); return; } if(peer->account->cannot_be_kicked) { wd_reply(515, WI_STR("Cannot Be Disconnected")); return; } wd_broadcast_lock(); wd_broadcast(WD_PUBLIC_CID, 307, WI_STR("%u%c%u%c%#@"), peer->uid, WD_FIELD_SEPARATOR, client->uid, WD_FIELD_SEPARATOR, WI_ARRAY(arguments, 1)); wd_broadcast_unlock(); wi_log_ll(WI_STR("%@/%@/%@ banned %@/%@/%@"), client->nick, client->login, client->ip, peer->nick, peer->login, peer->ip); wd_tempban(peer->ip); wi_lock_lock(peer->flag_lock); peer->state = WD_CLIENT_STATE_DISCONNECTED; wi_lock_unlock(peer->flag_lock); }
static void wd_cmd_decline(wi_array_t *arguments) { wd_client_t *client = wd_client(); wd_chat_t *chat; wd_cid_t cid; cid = wi_string_uint32(WI_ARRAY(arguments, 0)); chat = wd_chat_with_cid(cid); if(!chat) return; if(wd_chat_contains_client(chat, client)) return; wd_broadcast_lock(); wd_broadcast(chat->cid, 332, WI_STR("%u%c%u"), chat->cid, WD_FIELD_SEPARATOR, client->uid); wd_broadcast_unlock(); }
void wd_chat_broadcast_user_leave(wd_chat_t *chat, wd_user_t *user) { wd_broadcast(chat, 303, WI_STR("%u%c%u"), chat->cid, WD_FIELD_SEPARATOR, wd_user_uid(user)); }
void wd_server_apply_settings(void) { wi_string_t *string; wi_data_t *data; /* reload banner */ if(wd_settings.banner) { if(wd_settings.banner_changed) { data = wi_data_init_with_contents_of_file(wi_data_alloc(), wd_settings.banner); if(data) { wi_release(wd_banner); wd_banner = wi_retain(wi_data_base64(data)); } else { wi_log_err(WI_STR("Could not open %@: %m"), wd_settings.banner); } wi_release(data); } } else { wi_release(wd_banner); wd_banner = NULL; } /* reload server name/description */ if(wd_settings.name_changed || wd_settings.description_changed) { string = wi_date_iso8601_string(wd_start_date); wd_broadcast(wd_public_chat, 200, WI_STR("%#@%c%#@%c%#@%c%#@%c%#@%c%u%c%llu"), wd_server_version_string, WD_FIELD_SEPARATOR, wd_protocol_version_string, WD_FIELD_SEPARATOR, wd_settings.name, WD_FIELD_SEPARATOR, wd_settings.description, WD_FIELD_SEPARATOR, string, WD_FIELD_SEPARATOR, wd_files_unique_count, WD_FIELD_SEPARATOR, wd_files_unique_size); } /* set SSL cipher list */ if(wd_settings.controlcipher) { if(!wi_socket_context_set_ssl_ciphers(wd_control_socket_context, wd_settings.controlcipher)) { wi_log_err(WI_STR("Could not set SSL cipher list \"%@\": %m"), wd_settings.controlcipher); } } if(wd_settings.transfercipher) { if(!wi_socket_context_set_ssl_ciphers(wd_transfer_socket_context, wd_settings.transfercipher)) { wi_log_err(WI_STR("Could not set SSL cipher list \"%@\": %m"), wd_settings.transfercipher); } } /* load SSL certificate */ if(wd_settings.certificate) { if(!wi_socket_context_set_ssl_certificate(wd_control_socket_context, wd_settings.certificate) || !wi_socket_context_set_ssl_certificate(wd_transfer_socket_context, wd_settings.certificate)) { wi_log_err(WI_STR("Could not load certificate %@: %m"), wd_settings.certificate); } } }