int relay_buffer_input_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, const char *input_data) { struct t_relay_client *client, *ptr_client, *next_client; /* make C compiler happy */ (void) pointer; (void) data; if (buffer == relay_raw_buffer) { if (weechat_strcasecmp (input_data, "q") == 0) weechat_buffer_close (buffer); } else if (buffer == relay_buffer) { client = relay_client_search_by_number (relay_buffer_selected_line); /* disconnect client */ if (weechat_strcasecmp (input_data, "d") == 0) { if (client && !RELAY_CLIENT_HAS_ENDED(client)) { relay_client_disconnect (client); relay_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); } } /* purge old clients */ else if (weechat_strcasecmp (input_data, "p") == 0) { ptr_client = relay_clients; while (ptr_client) { next_client = ptr_client->next_client; if (RELAY_CLIENT_HAS_ENDED(ptr_client)) relay_client_free (ptr_client); ptr_client = next_client; } relay_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); } /* quit relay buffer (close it) */ else if (weechat_strcasecmp (input_data, "q") == 0) { weechat_buffer_close (buffer); } /* remove client */ else if (weechat_strcasecmp (input_data, "r") == 0) { if (client && RELAY_CLIENT_HAS_ENDED(client)) { relay_client_free (client); relay_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); } } } return WEECHAT_RC_OK; }
void relay_weechat_protocol_recv (struct t_relay_client *client, const char *data) { char *pos, *id, *command, **argv, **argv_eol; int i, argc, return_code; struct t_relay_weechat_protocol_cb protocol_cb[] = { { "init", &relay_weechat_protocol_cb_init }, { "hdata", &relay_weechat_protocol_cb_hdata }, { "info", &relay_weechat_protocol_cb_info }, { "infolist", &relay_weechat_protocol_cb_infolist }, { "nicklist", &relay_weechat_protocol_cb_nicklist }, { "input", &relay_weechat_protocol_cb_input }, { "sync", &relay_weechat_protocol_cb_sync }, { "desync", &relay_weechat_protocol_cb_desync }, { "test", &relay_weechat_protocol_cb_test }, { "ping", &relay_weechat_protocol_cb_ping }, { "quit", &relay_weechat_protocol_cb_quit }, { NULL, NULL } }; if (!data || !data[0] || RELAY_CLIENT_HAS_ENDED(client)) return; /* display debug message */ if (weechat_relay_plugin->debug >= 2) { weechat_printf (NULL, "%s: recv from client %s%s%s: \"%s\"", RELAY_PLUGIN_NAME, RELAY_COLOR_CHAT_CLIENT, client->desc, RELAY_COLOR_CHAT, data); } /* extract id */ id = NULL; if (data[0] == '(') { pos = strchr (data, ')'); if (pos) { id = weechat_strndup (data + 1, pos - data - 1); data = pos + 1; while (data[0] == ' ') { data++; } } } /* search end of data */ pos = strchr (data, ' '); if (pos) command = weechat_strndup (data, pos - data); else command = strdup (data); if (!command) { if (id) free (id); return; } argc = 0; argv = NULL; argv_eol = NULL; if (pos) { while (pos[0] == ' ') { pos++; } argv = weechat_string_split (pos, " ", 0, 0, &argc); argv_eol = weechat_string_split (pos, " ", 2, 0, NULL); } for (i = 0; protocol_cb[i].name; i++) { if (strcmp (protocol_cb[i].name, command) == 0) { if ((strcmp (protocol_cb[i].name, "init") != 0) && (!RELAY_WEECHAT_DATA(client, password_ok))) { /* * command is not "init" and password is not set? * then close connection! */ relay_client_set_status (client, RELAY_STATUS_AUTH_FAILED); } else { return_code = (int) (protocol_cb[i].cmd_function) (client, id, protocol_cb[i].name, argc, argv, argv_eol); if ((weechat_relay_plugin->debug >= 1) && (return_code == WEECHAT_RC_ERROR)) { weechat_printf (NULL, _("%s%s: failed to execute command \"%s\" " "for client %s%s%s"), weechat_prefix ("error"), RELAY_PLUGIN_NAME, command, RELAY_COLOR_CHAT_CLIENT, client->desc, RELAY_COLOR_CHAT); } } break; } } if (id) free (id); free (command); if (argv) weechat_string_free_split (argv); if (argv_eol) weechat_string_free_split (argv_eol); }
void relay_buffer_refresh (const char *hotlist) { struct t_relay_client *ptr_client, *client_selected; char str_color[256], str_status[64], str_date_start[128], str_date_end[128]; char *str_recv, *str_sent; int i, length, line; struct tm *date_tmp; if (relay_buffer) { weechat_buffer_clear (relay_buffer); line = 0; client_selected = relay_client_search_by_number (relay_buffer_selected_line); weechat_printf_y (relay_buffer, 0, "%s%s%s%s%s%s%s", weechat_color("green"), _("Actions (letter+enter):"), weechat_color("lightgreen"), /* disconnect */ (client_selected && !RELAY_CLIENT_HAS_ENDED(client_selected)) ? _(" [D] Disconnect") : "", /* remove */ (client_selected && RELAY_CLIENT_HAS_ENDED(client_selected)) ? _(" [R] Remove") : "", /* purge old */ _(" [P] Purge finished"), /* quit */ _(" [Q] Close this buffer")); for (ptr_client = relay_clients; ptr_client; ptr_client = ptr_client->next_client) { snprintf (str_color, sizeof (str_color), "%s,%s", (line == relay_buffer_selected_line) ? weechat_config_string (relay_config_color_text_selected) : weechat_config_string (relay_config_color_text), weechat_config_string (relay_config_color_text_bg)); snprintf (str_status, sizeof (str_status), "%s", _(relay_client_status_string[ptr_client->status])); length = weechat_utf8_strlen_screen (str_status); if (length < 20) { for (i = 0; i < 20 - length; i++) { strcat (str_status, " "); } } str_date_start[0] = '\0'; date_tmp = localtime (&(ptr_client->start_time)); if (date_tmp) { strftime (str_date_start, sizeof (str_date_start), "%a, %d %b %Y %H:%M:%S", date_tmp); } str_date_end[0] = '-'; str_date_end[1] = '\0'; if (ptr_client->end_time > 0) { date_tmp = localtime (&(ptr_client->end_time)); if (date_tmp) { strftime (str_date_end, sizeof (str_date_end), "%a, %d %b %Y %H:%M:%S", date_tmp); } } str_recv = weechat_string_format_size (ptr_client->bytes_recv); str_sent = weechat_string_format_size (ptr_client->bytes_sent); /* first line with status, description and bytes recv/sent */ weechat_printf_y (relay_buffer, (line * 2) + 2, _("%s%s[%s%s%s%s] %s, received: %s, sent: %s"), weechat_color(str_color), (line == relay_buffer_selected_line) ? "*** " : " ", weechat_color(weechat_config_string (relay_config_color_status[ptr_client->status])), str_status, weechat_color ("reset"), weechat_color (str_color), ptr_client->desc, (str_recv) ? str_recv : "?", (str_sent) ? str_sent : "?"); /* second line with start/end time */ weechat_printf_y (relay_buffer, (line * 2) + 3, _("%s%-26s started on: %s, ended on: %s"), weechat_color(str_color), " ", str_date_start, str_date_end); if (str_recv) free (str_recv); if (str_sent) free (str_sent); line++; } if (hotlist) weechat_buffer_set (relay_buffer, "hotlist", hotlist); } }
void relay_client_set_status (struct t_relay_client *client, enum t_relay_status status) { client->status = status; if (RELAY_CLIENT_HAS_ENDED(client)) { client->end_time = time (NULL); if (client->hook_fd) { weechat_unhook (client->hook_fd); client->hook_fd = NULL; } switch (client->protocol) { case RELAY_PROTOCOL_WEECHAT: relay_weechat_close_connection (client); break; case RELAY_PROTOCOL_IRC: relay_irc_close_connection (client); break; case RELAY_NUM_PROTOCOLS: break; } switch (client->status) { case RELAY_STATUS_AUTH_FAILED: weechat_printf (NULL, _("%s%s: authentication failed with client %s%s%s (%s%s%s)"), weechat_prefix ("error"), RELAY_PLUGIN_NAME, RELAY_COLOR_CHAT_HOST, client->address, RELAY_COLOR_CHAT, relay_protocol_string[client->protocol], (client->protocol_args) ? "." : "", (client->protocol_args) ? client->protocol_args : ""); break; case RELAY_STATUS_DISCONNECTED: weechat_printf (NULL, _("%s: disconnected from client %s%s%s (%s%s%s)"), RELAY_PLUGIN_NAME, RELAY_COLOR_CHAT_HOST, client->address, RELAY_COLOR_CHAT, relay_protocol_string[client->protocol], (client->protocol_args) ? "." : "", (client->protocol_args) ? client->protocol_args : ""); break; default: break; } if (client->sock >= 0) { close (client->sock); client->sock = -1; } } relay_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); }
void relay_command_client_list (int full) { struct t_relay_client *ptr_client; char date_start[128], date_activity[128]; struct tm *date_tmp; int num_found; num_found = 0; for (ptr_client = relay_clients; ptr_client; ptr_client = ptr_client->next_client) { if (!full && RELAY_CLIENT_HAS_ENDED(ptr_client)) continue; if (num_found == 0) { weechat_printf (NULL, ""); weechat_printf (NULL, (full) ? _("Clients for relay:") : _("Connected clients for relay:")); } num_found++; date_start[0] = '\0'; date_tmp = localtime (&(ptr_client->start_time)); if (date_tmp) { strftime (date_start, sizeof (date_start), "%a, %d %b %Y %H:%M:%S", date_tmp); } date_activity[0] = '\0'; date_tmp = localtime (&(ptr_client->last_activity)); if (date_tmp) { strftime (date_activity, sizeof (date_activity), "%a, %d %b %Y %H:%M:%S", date_tmp); } if (full) { weechat_printf (NULL, _(" %s%s%s (%s%s%s), started on: %s, last activity: %s, " "bytes: %lu recv, %lu sent"), RELAY_COLOR_CHAT_CLIENT, ptr_client->desc, RELAY_COLOR_CHAT, weechat_color (weechat_config_string (relay_config_color_status[ptr_client->status])), relay_client_status_string[ptr_client->status], RELAY_COLOR_CHAT, date_start, date_activity, ptr_client->bytes_recv, ptr_client->bytes_sent); } else { weechat_printf (NULL, _(" %s%s%s (%s%s%s), started on: %s"), RELAY_COLOR_CHAT_CLIENT, ptr_client->desc, RELAY_COLOR_CHAT, weechat_color (weechat_config_string (relay_config_color_status[ptr_client->status])), relay_client_status_string[ptr_client->status], RELAY_COLOR_CHAT, date_start); } } if (num_found == 0) { weechat_printf (NULL, (full) ? _("No client for relay") : _("No connected client for relay")); } }