From: Pekka Riikonen Date: Thu, 2 Nov 2000 22:13:48 +0000 (+0000) Subject: NAMES command works now from user interface. X-Git-Tag: SILC.0.1~332 X-Git-Url: http://git.silcnet.org/gitweb/?a=commitdiff_plain;h=ac4968593786fc53101bc4a60f00bc728cbcdf3e;p=silc.git NAMES command works now from user interface. Added realname pointer to SilcClientEntry. --- diff --git a/lib/silcclient/client.c b/lib/silcclient/client.c index 44659ada..9737ceff 100644 --- a/lib/silcclient/client.c +++ b/lib/silcclient/client.c @@ -1767,6 +1767,7 @@ void silc_client_receive_new_id(SilcClient client, sprintf(conn->local_entry->username, "%s@%s", client->username, client->hostname); } + conn->local_entry->server = strdup(conn->remote_host); conn->local_entry->id = conn->local_id; /* Put it to the ID cache */ diff --git a/lib/silcclient/command.c b/lib/silcclient/command.c index 1d215058..b19b8bec 100644 --- a/lib/silcclient/command.c +++ b/lib/silcclient/command.c @@ -283,7 +283,7 @@ SILC_CLIENT_CMD_FUNC(nick) goto out; } - if (!strncmp(conn->nickname, cmd->argv[1], cmd->argv_lens[1])) + if (!strcmp(conn->nickname, cmd->argv[1])) goto out; /* Show current nickname */ diff --git a/lib/silcclient/command_reply.c b/lib/silcclient/command_reply.c index 8b2f0c35..91562fdb 100644 --- a/lib/silcclient/command_reply.c +++ b/lib/silcclient/command_reply.c @@ -241,12 +241,29 @@ silc_client_command_reply_whois_print(SilcClientCommandReplyContext cmd, silc_parse_nickname(nickname, &client_entry->nickname, &client_entry->server, &client_entry->num); client_entry->username = strdup(username); + if (realname) + client_entry->realname = strdup(realname); /* Add client to cache */ silc_idcache_add(conn->client_cache, client_entry->nickname, SILC_ID_CLIENT, client_id, (void *)client_entry, TRUE); } else { client_entry = (SilcClientEntry)id_cache->context; + if (client_entry->nickname) + silc_free(client_entry->nickname); + if (client_entry->server) + silc_free(client_entry->server); + if (client_entry->username) + silc_free(client_entry->username); + if (client_entry->realname) + silc_free(client_entry->realname); + + silc_parse_nickname(nickname, &client_entry->nickname, + &client_entry->server, &client_entry->num); + client_entry->username = strdup(username); + if (realname) + client_entry->realname = strdup(realname); + silc_free(client_id); } @@ -335,6 +352,7 @@ SILC_CLIENT_CMD_REPLY_FUNC(identify) SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context; SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data; SilcClientEntry client_entry; + SilcIDCacheEntry id_cache = NULL; SilcCommandStatus status; unsigned char *tmp; @@ -368,23 +386,44 @@ SILC_CLIENT_CMD_REPLY_FUNC(identify) unsigned char *id_data; char *nickname; char *username; + SilcClientID *client_id; id_data = silc_argument_get_arg_type(cmd->args, 2, &len); + if (!id_data) + goto out; + client_id = silc_id_payload_parse_id(id_data, len); + nickname = silc_argument_get_arg_type(cmd->args, 3, NULL); username = silc_argument_get_arg_type(cmd->args, 4, NULL); - /* Allocate client entry */ - client_entry = silc_calloc(1, sizeof(*client_entry)); - client_entry->id = silc_id_payload_parse_id(id_data, len); - if (nickname) + if (!silc_idcache_find_by_id_one(conn->client_cache, (void *)client_id, + SILC_ID_CLIENT, &id_cache)) { + client_entry = silc_calloc(1, sizeof(*client_entry)); + client_entry->id = client_id; + silc_parse_nickname(nickname, &client_entry->nickname, + &client_entry->server, &client_entry->num); + if (username) + client_entry->username = strdup(username); + + /* Add client to cache */ + silc_idcache_add(conn->client_cache, client_entry->nickname, + SILC_ID_CLIENT, client_id, (void *)client_entry, TRUE); + } else { + client_entry = (SilcClientEntry)id_cache->context; + if (client_entry->nickname) + silc_free(client_entry->nickname); + if (client_entry->server) + silc_free(client_entry->server); + if (username && client_entry->username) + silc_free(client_entry->username); + silc_parse_nickname(nickname, &client_entry->nickname, &client_entry->server, &client_entry->num); - if (username) - client_entry->username = strdup(username); - /* Save received Client ID to ID cache */ - silc_idcache_add(conn->client_cache, client_entry->nickname, - SILC_ID_CLIENT, client_entry->id, client_entry, TRUE); + if (username) + client_entry->username = strdup(username); + silc_free(client_id); + } } if (status == SILC_STATUS_LIST_START) { @@ -988,30 +1027,13 @@ SILC_CLIENT_CMD_REPLY_FUNC(names) channel = (SilcChannelEntry)id_cache->context; - /* If there is pending command we know that user has called this command - and we will handle the name list differently. */ - if (cmd->callback) { - /* We will resolve all the necessary information about the people - on the channel. Only after that will we display the user list. */ - for (i = 0; i < len1; i++) { - /* XXX */ - + /* Remove commas from list */ + for (i = 0; i < len1; i++) + if (name_list[i] == ',') { + name_list[i] = ' '; + list_count++; } - silc_client_command_pending_del(SILC_COMMAND_NAMES); - } else { - /* there is no pending callback it means that this command reply - has been received without calling the command, ie. server has sent - the reply without getting the command from us first. This happens - with SILC servers that sends NAMES reply after joining to a channel. */ - - /* Remove commas from list */ - for (i = 0; i < len1; i++) - if (name_list[i] == ',') { - name_list[i] = ' '; - list_count++; - } - list_count++; - } + list_count++; /* Remove old client list from channel, if exists */ if (channel->clients) { @@ -1102,39 +1124,91 @@ SILC_CLIENT_CMD_REPLY_FUNC(names) silc_free(nickname); } - name_list = NULL; - len1 = 0; - for (k = 0; k < channel->clients_count; k++) { - char *m, *n = channel->clients[k].client->nickname; - len2 = strlen(n); - len1 += len2; + /* XXX hmm... actually it is applications business to display this + information. We should just pass (as we do) the data to application and + let it to parse it and display it the way it wants. */ + if (cmd->callback) { + cmd->client->ops->say(cmd->client, conn, "Users on %s", + channel->channel_name); + + for (k = 0; k < channel->clients_count; k++) { + SilcClientEntry e = channel->clients[k].client; + char *m, tmp[80], line[80]; + + memset(line, 0, sizeof(line)); + memset(tmp, 0, sizeof(tmp)); + m = silc_client_chumode_char(channel->clients[k].mode); + + strcat(line, " "); + strcat(line, e->nickname); + strcat(line, e->server ? "@" : ""); + + len1 = 0; + if (e->server) + len1 = strlen(e->server); + strncat(line, e->server ? e->server : "", len1 > 30 ? 30 : len1); + + len1 = strlen(line); + if (len1 >= 30) { + memset(&line[29], 0, len1 - 29); + } else { + for (i = 0; i < 30 - len1 - 1; i++) + strcat(line, " "); + } + + strcat(line, " H"); + strcat(tmp, m ? m : ""); + strcat(line, tmp); - name_list = silc_realloc(name_list, sizeof(*name_list) * (len1 + 3)); + if (strlen(tmp) < 5) + for (i = 0; i < 5 - strlen(tmp); i++) + strcat(line, " "); - m = silc_client_chumode_char(channel->clients[k].mode); - if (m) { - memcpy(name_list + (len1 - len2), m, strlen(m)); - len1 += strlen(m); - silc_free(m); + strcat(line, e->username ? e->username : ""); + + cmd->client->ops->say(cmd->client, conn, "%s", line); + + if (m) + silc_free(m); } - memcpy(name_list + (len1 - len2), n, len2); - name_list[len1] = 0; + } else { + name_list = NULL; + len1 = 0; + for (k = 0; k < channel->clients_count; k++) { + char *m, *n = channel->clients[k].client->nickname; + len2 = strlen(n); + len1 += len2; + + name_list = silc_realloc(name_list, sizeof(*name_list) * (len1 + 3)); + + m = silc_client_chumode_char(channel->clients[k].mode); + if (m) { + memcpy(name_list + (len1 - len2), m, strlen(m)); + len1 += strlen(m); + silc_free(m); + } + + memcpy(name_list + (len1 - len2), n, len2); + name_list[len1] = 0; - if (k == channel->clients_count - 1) - break; - memcpy(name_list + len1, " ", 1); - len1++; + if (k == channel->clients_count - 1) + break; + memcpy(name_list + len1, " ", 1); + len1++; + } + + cmd->client->ops->say(cmd->client, conn, + "Users on %s: %s", channel->channel_name, name_list); + silc_free(name_list); } - cmd->client->ops->say(cmd->client, conn, - "Users on %s: %s", channel->channel_name, name_list); + name_list = silc_argument_get_arg_type(cmd->args, 3, &len1); /* Notify application */ COMMAND_REPLY((ARGS, channel, name_list, client_id_list->head, client_mode_list->head)); - silc_free(name_list); silc_buffer_free(client_id_list); silc_buffer_free(client_mode_list); diff --git a/lib/silcclient/idlist.h b/lib/silcclient/idlist.h index b71a0fa1..f5c5abf0 100644 --- a/lib/silcclient/idlist.h +++ b/lib/silcclient/idlist.h @@ -26,9 +26,10 @@ client entry. This entry also includes the private message keys if they are used. */ typedef struct SilcClientEntryStruct { - char *nickname; /* nickname[@server] */ + char *nickname; /* nickname */ char *username; /* username[@host] */ char *server; /* SILC server name */ + char *realname; unsigned int num; SilcClientID *id;