static void wr_msg_341(wi_array_t *arguments) { wi_date_t *date; wr_chat_t *chat; wr_window_t *window; wr_cid_t cid; cid = wi_string_uint32(WI_ARRAY(arguments, 0)); chat = wr_chats_chat_with_cid(cid); if(chat) { window = wr_windows_window_with_chat(chat); if(window && wr_window_is_chat(window)) { wi_release(window->topic.nick); window->topic.nick = wi_retain(WI_ARRAY(arguments, 1)); wi_release(window->topic.date); date = wi_date_with_rfc3339_string(WI_ARRAY(arguments, 4)); window->topic.date = wi_retain(wi_date_string_with_format(date, WI_STR("%a %b %e %T %Y"))); wi_release(window->topic.topic); window->topic.topic = wi_retain(WI_ARRAY(arguments, 5)); wr_draw_header(); wr_print_topic(); } } }
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(); } } }
static void wd_cmd_invite(wi_array_t *arguments) { wd_client_t *client = wd_client(); wd_client_t *peer; wd_chat_t *chat; wd_uid_t uid; wd_cid_t cid; 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; } cid = wi_string_uint32(WI_ARRAY(arguments, 1)); chat = wd_chat_with_cid(cid); if(!chat) return; if(!wd_chat_contains_client(chat, client)) return; if(wd_chat_contains_client(chat, peer)) return; wd_client_lock_socket(peer); wd_sreply(peer->socket, 331, WI_STR("%u%c%u"), cid, WD_FIELD_SEPARATOR, client->uid); wd_client_unlock_socket(peer); }
static void wd_cmd_move(wi_array_t *arguments) { wd_client_t *client = wd_client(); wi_string_t *frompath, *topath; wi_string_t *properfrompath, *propertopath; frompath = WI_ARRAY(arguments, 0); topath = WI_ARRAY(arguments, 1); if(!wd_files_path_is_valid(frompath) || !wd_files_path_is_valid(topath)) { wd_reply(520, WI_STR("File or Directory Not Found")); return; } if(!client->account->view_dropboxes) { if(wd_files_path_is_dropbox(frompath)) { wd_reply(520, WI_STR("File or Directory Not Found")); return; } } properfrompath = wi_string_by_normalizing_path(frompath); propertopath = wi_string_by_normalizing_path(topath); if(wd_files_move_path(properfrompath, propertopath)) { wi_log_ll(WI_STR("%@/%@/%@ moved \"%@\" to \"%@\""), client->nick, client->login, client->ip, properfrompath, propertopath); } }
static void wr_msg_307(wi_array_t *arguments) { wi_string_t *message; wr_user_t *killer, *victim; wr_uid_t killer_uid, victim_uid; victim_uid = wi_string_uint32(WI_ARRAY(arguments, 0)); killer_uid = wi_string_uint32(WI_ARRAY(arguments, 1)); message = WI_ARRAY(arguments, 2); victim = wr_chat_user_with_uid(wr_public_chat, victim_uid); killer = wr_chat_user_with_uid(wr_public_chat, killer_uid); if(killer && victim) { if(wi_string_length(message) > 0) { wr_wprintf_prefix(wr_console_window, WI_STR("%@ was banned by %@: %@"), wr_user_nick(victim), wr_user_nick(killer), message); } else { wr_wprintf_prefix(wr_console_window, WI_STR("%@ was banned by %@"), wr_user_nick(victim), wr_user_nick(killer)); } } if(victim) { wr_chat_remove_user(wr_public_chat, victim); wr_draw_divider(); } }
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 wr_msg_411(wi_array_t *arguments) { wr_transfer_t *transfer; wi_file_offset_t free; if(wr_ls_state == WR_LS_LISTING) { free = wi_string_uint64(WI_ARRAY(arguments, 1)); wr_printf_prefix(WI_STR("Listing of %@ (%@ available):"), wr_files_ld, wr_files_string_for_size(free)); if(wi_array_count(wr_files) == 0) wr_printf_block(WI_STR("(empty)")); else wr_print_files(); } else if(wr_ls_state == WR_LS_TRANSFER) { transfer = wr_transfers_transfer_with_remote_path(WI_ARRAY(arguments, 0)); if(transfer) { if(transfer->type == WR_TRANSFER_DOWNLOAD) wr_transfer_download_add_files(transfer, wr_files); else wr_transfer_upload_remove_files(transfer, wr_files); transfer->state = WR_TRANSFER_WAITING; transfer->listed = true; wr_transfer_request(transfer); } } }
static void wd_cmd_topic(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(cid == WD_PUBLIC_CID) { if(!client->account->set_topic) { wd_reply(516, WI_STR("Permission Denied")); return; } } else { if(!wd_chat_contains_client(chat, client)) return; } wd_chat_set_topic(chat, WI_ARRAY(arguments, 1)); wd_broadcast_lock(); wd_chat_broadcast_topic(chat); wd_broadcast_unlock(); }
static void wd_cmd_comment(wi_array_t *arguments) { wd_client_t *client = wd_client(); wi_string_t *path; if(!client->account->alter_files) { wd_reply(516, WI_STR("Permission Denied")); return; } path = WI_ARRAY(arguments, 0); if(!wd_files_path_is_valid(path)) { wd_reply(520, WI_STR("File or Directory Not Found")); return; } if(!client->account->view_dropboxes) { if(wd_files_path_is_dropbox(path)) { wd_reply(520, WI_STR("File or Directory Not Found")); return; } } wd_files_set_comment(wi_string_by_normalizing_path(path), WI_ARRAY(arguments, 1)); }
static void wr_command_msg(wi_array_t *arguments) { wi_p7_message_t *message; wi_string_t *nick; wr_user_t *user; wr_window_t *window; nick = WI_ARRAY(arguments, 0); user = wr_chat_user_with_nick(wr_public_chat, nick); if(!user) { wr_printf_prefix(WI_STR("msg: %@: Client not found"), nick); return; } message = wi_p7_message_with_name(WI_STR("wired.message.send_message"), wr_p7_spec); wi_p7_message_set_uint32_for_name(message, wr_user_id(user), WI_STR("wired.user.id")); wi_p7_message_set_string_for_name(message, WI_ARRAY(arguments, 1), WI_STR("wired.message.message")); wr_commands_send_message(message, WI_STR("msg")); // window = wr_windows_window_with_user(user); // if(!window) { // window = wr_window_init_with_user(wr_window_alloc(), user); // wr_windows_add_window(window); // wi_release(window); // } // wr_windows_show_window(window); // wr_wprint_say(window, wr_nick, WI_ARRAY(arguments, 1)); }
static void wr_msg_331(wi_array_t *arguments) { wr_window_t *window; wr_chat_t *chat; wr_user_t *user; wr_cid_t cid; wr_uid_t uid; cid = wi_string_uint32(WI_ARRAY(arguments, 0)); uid = wi_string_uint32(WI_ARRAY(arguments, 1)); user = wr_chat_user_with_uid(wr_public_chat, uid); if(user) { wr_send_command(WI_STR("JOIN %u"), cid); wr_send_command(WI_STR("WHO %u"), cid); chat = wr_chat_init_private_chat(wr_chat_alloc()); wr_chat_set_id(chat, cid); wr_chats_add_chat(chat); wi_release(chat); window = wr_window_init_with_chat(wr_window_alloc(), chat); wr_windows_add_window(window); wr_windows_show_window(window); wi_release(window); } }
void wr_transfer_upload_remove_files(wr_transfer_t *transfer, wi_array_t *files) { wi_enumerator_t *enumerator; wr_file_t *file; wi_uinteger_t i, count; count = wi_array_count(transfer->remote_paths); enumerator = wi_array_data_enumerator(files); while((file = wi_enumerator_next_data(enumerator))) { for(i = 0; i < count; i++) { if(wi_is_equal(wr_file_path(file), WI_ARRAY(transfer->remote_paths, i))) { transfer->total_size -= wr_file_size(WI_ARRAY(transfer->files, i)); wi_mutable_array_remove_data_at_index(transfer->remote_paths, i); wi_mutable_array_remove_data_at_index(transfer->local_paths, i); wi_mutable_array_remove_data_at_index(transfer->files, i); count--; break; } } } wr_transfers_recursive_upload = false; }
static void wr_msg_401(wi_array_t *arguments) { wr_transfer_t *transfer; transfer = wr_transfers_transfer_with_remote_path(WI_ARRAY(arguments, 0)); if(transfer) { transfer->state = WR_TRANSFER_QUEUED; transfer->queue = wi_string_uint32(WI_ARRAY(arguments, 1)); } }
static void wr_msg_400(wi_array_t *arguments) { wr_transfer_t *transfer; transfer = wr_transfers_transfer_with_remote_path(WI_ARRAY(arguments, 0)); if(!transfer) return; wr_transfer_open(transfer, wi_string_uint64(WI_ARRAY(arguments, 1)), WI_ARRAY(arguments, 2)); }
static wi_boolean_t _wi_config_parse_string(wi_config_t *config, wi_string_t *string, wi_string_t **name, wi_string_t **value) { wi_array_t *array; array = wi_string_components_separated_by_string(string, WI_STR("=")); if(wi_array_count(array) != 2) return false; *name = wi_string_by_deleting_surrounding_whitespace(WI_ARRAY(array, 0)); *value = wi_string_by_deleting_surrounding_whitespace(WI_ARRAY(array, 1)); return true; }
static void wd_cmd_get(wi_array_t *arguments) { wd_client_t *client = wd_client(); wi_string_t *path, *properpath; wi_file_offset_t offset; uint32_t count; if(!client->account->download) { wd_reply(516, WI_STR("Permission Denied")); return; } path = WI_ARRAY(arguments, 0); if(!wd_files_path_is_valid(path)) { wd_reply(520, WI_STR("File or Directory Not Found")); return; } if(!client->account->view_dropboxes) { if(wd_files_path_is_dropbox(path)) { wd_reply(520, WI_STR("File or Directory Not Found")); return; } } count = wd_transfers_count_of_client(client, WD_TRANSFER_DOWNLOAD); if(count >= wd_settings.clientdownloads) { if(count > wd_settings.clientdownloads) { wd_reply(523, WI_STR("Queue Limit Exceeded")); return; } else { wi_thread_sleep(0.5); if(wd_transfers_count_of_client(client, WD_TRANSFER_DOWNLOAD) >= wd_settings.clientdownloads) { wd_reply(523, WI_STR("Queue Limit Exceeded")); return; } } } properpath = wi_string_by_normalizing_path(path); offset = wi_string_uint64(WI_ARRAY(arguments, 1)); wd_transfers_queue_download(properpath, offset); }
static void wr_msg_309(wi_array_t *arguments) { wr_user_t *user; wr_uid_t uid; uid = wi_string_uint32(WI_ARRAY(arguments, 0)); user = wr_chat_user_with_uid(wr_public_chat, uid); if(user && !wr_is_ignored(wr_user_nick(user))) { wr_wprintf_prefix(wr_console_window, WI_STR("Broadcast message from %@:"), wr_user_nick(user)); wr_wprintf_block(wr_console_window, WI_STR("%@"), WI_ARRAY(arguments, 1)); } }
static void wr_msg_301(wi_array_t *arguments) { wr_chat_t *chat; wr_user_t *user; wr_cid_t cid; wr_uid_t uid; cid = wi_string_uint32(WI_ARRAY(arguments, 0)); uid = wi_string_uint32(WI_ARRAY(arguments, 1)); chat = wr_chats_chat_with_cid(cid); user = wr_chat_user_with_uid(chat, uid); if(user && !wr_is_ignored(wr_user_nick(user))) wr_wprint_me(wr_windows_window_with_chat(chat), wr_user_nick(user), WI_ARRAY(arguments, 2)); }
static wi_integer_t wd_transfers_compare_user(wi_runtime_instance_t *instance1, wi_runtime_instance_t *instance2) { wd_user_t *user1 = instance1; wd_user_t *user2 = instance2; wd_transfer_t *transfer1, *transfer2; transfer1 = WI_ARRAY(wd_user_transfers_queue(user1), 0); transfer2 = WI_ARRAY(wd_user_transfers_queue(user2), 0); if(transfer1->queue_time > transfer2->queue_time) return 1; else if(transfer2->queue_time > transfer1->queue_time) return -1; return 0; }
static wi_integer_t wd_transfers_queue_compare(wi_runtime_instance_t *instance1, wi_runtime_instance_t *instance2) { wi_array_t *queue1 = instance1; wi_array_t *queue2 = instance2; wd_transfer_t *transfer1, *transfer2; transfer1 = WI_ARRAY(queue1, 0); transfer2 = WI_ARRAY(queue2, 0); if(transfer1->queue_time > transfer2->queue_time) return 1; else if(transfer2->queue_time > transfer1->queue_time) return -1; return 0; }
static void wr_msg_400(wi_array_t *arguments) { wi_address_t *address; wr_transfer_t *transfer; transfer = wr_transfers_transfer_with_path(WI_ARRAY(arguments, 0)); if(!transfer) return; address = wi_copy(wr_address); wi_address_set_port(address, wi_address_port(address) + 1); transfer->state = WR_TRANSFER_RUNNING; transfer->offset = wi_string_uint64(WI_ARRAY(arguments, 1)); transfer->transferred = transfer->offset; transfer->key = wi_retain(WI_ARRAY(arguments, 2)); transfer->start_time = wi_time_interval(); transfer->socket = wi_socket_init_with_address(wi_socket_alloc(), address, WI_SOCKET_TCP); wi_socket_set_interactive(transfer->socket, false); if(!wi_socket_connect(transfer->socket, wr_socket_context, 15.0)) { wr_printf_prefix(WI_STR("Could not connect to %@: %m"), wi_address_string(address)); wr_transfer_stop(transfer); goto end; } wi_file_seek(transfer->file, transfer->offset); if(transfer->type == WR_TRANSFER_DOWNLOAD) { wi_socket_set_direction(transfer->socket, WI_SOCKET_READ); wr_runloop_add_socket(transfer->socket, wr_runloop_download_callback); } else { wi_socket_set_direction(transfer->socket, WI_SOCKET_WRITE); wr_runloop_add_socket(transfer->socket, wr_runloop_upload_callback); } wr_send_command_on_socket(transfer->socket, WI_STR("TRANSFER %#@"), transfer->key); wr_printf_prefix(WI_STR("Starting transfer of \"%@\""), transfer->name); wr_draw_transfers(true); end: wi_release(address); }
static void wr_command_icon(wi_array_t *arguments) { wi_p7_message_t *message; wi_string_t *path; wi_data_t *data; path = wi_string_by_normalizing_path(WI_ARRAY(arguments, 0)); data = wi_data_init_with_contents_of_file(wi_data_alloc(), path); if(data) { wi_release(wr_icon_path); wr_icon_path = wi_retain(path); wi_release(wr_icon); wr_icon = wi_retain(data); if(wr_connected) { message = wi_p7_message_with_name(WI_STR("wired.user.set_icon"), wr_p7_spec); wi_p7_message_set_data_for_name(message, wr_icon, WI_STR("wired.user.icon")); wr_commands_send_message(message, WI_STR("icon")); } wi_release(data); } else { wr_printf_prefix(WI_STR("icon: %@: %m"), path); } }
static void wd_cmd_delete(wi_array_t *arguments) { wd_client_t *client = wd_client(); wi_string_t *path, *properpath; if(!client->account->delete_files) { wd_reply(516, WI_STR("Permission Denied")); return; } path = WI_ARRAY(arguments, 0); if(!wd_files_path_is_valid(path)) { wd_reply(520, WI_STR("File or Directory Not Found")); return; } if(!client->account->view_dropboxes) { if(wd_files_path_is_dropbox(path)) { wd_reply(520, WI_STR("File or Directory Not Found")); return; } } properpath = wi_string_by_normalizing_path(path); if(wd_files_delete_path(properpath)) { wi_log_ll(WI_STR("%@/%@/%@ deleted \"%@\""), client->nick, client->login, client->ip, properpath); } }
static void wd_cmd_createuser(wi_array_t *arguments) { wd_client_t *client = wd_client(); wd_account_t *account; if(!client->account->create_accounts) { wd_reply(516, WI_STR("Permission Denied")); return; } account = wd_accounts_read_user(WI_ARRAY(arguments, 0)); if(account) { wd_reply(514, WI_STR("Account Exists")); return; } account = wi_autorelease(wd_account_init_user_with_array(wd_account_alloc(), arguments)); if(!wd_accounts_check_privileges(account)) { wd_reply(516, WI_STR("Permission Denied")); return; } if(wd_accounts_create_user(account)) { wi_log_ll(WI_STR("%@/%@/%@ created the user \"%@\""), client->nick, client->login, client->ip, account->name); } }
static wi_string_t * _wi_array_description(wi_runtime_instance_t *instance) { wi_array_t *array = instance; wi_string_t *string, *description; void *data; wi_uinteger_t i; string = wi_string_with_format(WI_STR("<%@ %p>{count = %lu, values = (\n"), wi_runtime_class_name(array), array, array->data_count); for(i = 0; i < array->data_count; i++) { data = WI_ARRAY(array, i); if(array->callbacks.description) description = (*array->callbacks.description)(data); else description = wi_string_with_format(WI_STR("%p"), data); wi_string_append_format(string, WI_STR(" %lu: %@\n"), i, description); } wi_string_append_string(string, WI_STR(")}")); return string; }
char * wr_readline_nickname_generator(const char *text, int state) { static wi_uinteger_t index; wi_array_t *users; wi_string_t *name; char *cname; wr_user_t *user; wi_uinteger_t count; if(!wr_window_is_chat(wr_current_window)) return NULL; users = wr_chat_users(wr_window_chat(wr_console_window)); if(state == 0) index = 0; cname = ((*rl_filename_dequoting_function) ((char *) text, 0)); name = wi_string_with_cstring(cname); free(cname); count = wi_array_count(users); while(index < count) { user = WI_ARRAY(users, index++); if(wi_string_index_of_string(user->nick, name, WI_STRING_SMART_CASE_INSENSITIVE) == 0) return strdup(wi_string_cstring(user->nick)); } return NULL; }
static wi_array_t * _wi_terminal_buffer_lines_for_string(wi_terminal_buffer_t *buffer, wi_string_t *string) { wi_array_t *array, *linearray; wi_string_t *string_copy, *line, *subline; wi_size_t size; uint32_t i, count, index; array = wi_array_init(wi_array_alloc()); size = wi_terminal_size(buffer->terminal); linearray = wi_string_components_separated_by_string(string, WI_STR("\n")); count = wi_array_count(linearray); for(i = 0; i < count; i++) { line = WI_ARRAY(linearray, i); if(wi_terminal_width_of_string(buffer->terminal, line) < size.width) { wi_array_add_data(array, line); } else { string_copy = wi_copy(line); do { index = wi_terminal_index_of_string_for_width(buffer->terminal, string_copy, size.width); subline = wi_string_substring_to_index(string_copy, index); wi_array_add_data(array, subline); wi_string_delete_characters_to_index(string_copy, wi_string_length(subline)); } while(wi_terminal_width_of_string(buffer->terminal, string_copy) >= size.width); wi_array_add_data(array, string_copy); wi_release(string_copy); } } return array; }
static void _wi_terminal_buffer_draw_line(wi_terminal_buffer_t *buffer, uint32_t line) { wi_point_t location; wi_range_t scroll; uint32_t i, count; location = wi_terminal_location(buffer->terminal); scroll = wi_terminal_scroll(buffer->terminal); count = wi_array_count(buffer->linebuffer); if(line < scroll.length) wi_terminal_move(buffer->terminal, wi_make_point(0, scroll.length - line)); else wi_terminal_move(buffer->terminal, wi_make_point(0, scroll.location)); buffer->line = line; for(i = line; i < count && i < line + scroll.length; i++) { _wi_terminal_puts(buffer->terminal, WI_STR("\n")); _wi_terminal_puts(buffer->terminal, WI_ARRAY(buffer->linebuffer, i)); buffer->line++; } wi_terminal_move(buffer->terminal, location); }
static void wr_command_ignore(wi_array_t *arguments) { wi_enumerator_t *enumerator; wi_string_t *string; wr_ignore_t *ignore; if(wi_array_count(arguments) > 0) { string = WI_ARRAY(arguments, 0); ignore = wr_ignore_init_with_string(wr_ignore_alloc(), string); if(ignore) { wr_printf_prefix(WI_STR("Ignoring \"%@\""), wr_ignore_string(ignore)); wi_mutable_array_add_data(wr_ignores, ignore); wi_release(ignore); } else { wr_printf_prefix(WI_STR("ignore: Could not compile regular expression \"%@\": %m"), string); } } else { wr_printf_prefix(WI_STR("Ignores:")); if(wi_array_count(wr_ignores) == 0) { wr_printf_block(WI_STR("(none)")); } else { enumerator = wi_array_data_enumerator(wr_ignores); while((ignore = wi_enumerator_next_data(enumerator))) wr_printf_block(WI_STR("%u: %@"), wr_ignore_id(ignore), wr_ignore_string(ignore)); } } }
static void wr_command_broadcast(wi_array_t *arguments) { wi_p7_message_t *message; message = wi_p7_message_with_name(WI_STR("wired.message.send_broadcast"), wr_p7_spec); wi_p7_message_set_string_for_name(message, WI_ARRAY(arguments, 0), WI_STR("wired.message.broadcast")); wr_commands_send_message(message, WI_STR("broadcast")); }