X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=apps%2Firssi%2Fsrc%2Fsilc%2Fcore%2Fsilc-servers.c;h=4afc351790fa9bd65f574b910c5af4782d70bade;hp=d8085785adade075c7e8f48e13869d64f6dd75bb;hb=017dec75a98209fbef49eb496c2269b0c49e736d;hpb=8bedd95be03038c219f8a5ee9c7d0d02540c575c diff --git a/apps/irssi/src/silc/core/silc-servers.c b/apps/irssi/src/silc/core/silc-servers.c index d8085785..4afc3517 100644 --- a/apps/irssi/src/silc/core/silc-servers.c +++ b/apps/irssi/src/silc/core/silc-servers.c @@ -61,6 +61,7 @@ static void silc_send_channel(SILC_SERVER_REC *server, typedef struct { char *nick; char *msg; + SILC_SERVER_REC *server; } PRIVMSG_REC; /* Callback function that sends the private message if the client was @@ -73,18 +74,39 @@ static void silc_send_msg_clients(SilcClient client, void *context) { PRIVMSG_REC *rec = context; + SILC_SERVER_REC *server = rec->server; SilcClientEntry target; - - if (clients_count == 0) { + char *nickname = NULL; + + if (!clients_count) { printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, "Unknown nick: %s", rec->nick); } else { - target = clients[0]; /* FIXME: not a good idea :) */ - + if (clients_count > 1) { + silc_parse_userfqdn(rec->nick, &nickname, NULL); + + /* Find the correct one. The rec->nick might be a formatted nick + so this will find the correct one. */ + clients = silc_client_get_clients_local(silc_client, server->conn, + nickname, rec->nick, + &clients_count); + if (!clients) { + printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, "Unknown nick: %s", + rec->nick); + silc_free(nickname); + goto out; + } + silc_free(nickname); + } + + target = clients[0]; + + /* Send the private message */ silc_client_send_private_message(client, conn, target, 0, rec->msg, strlen(rec->msg), TRUE); } + out: g_free(rec->nick); g_free(rec->msg); g_free(rec); @@ -93,33 +115,36 @@ static void silc_send_msg_clients(SilcClient client, static void silc_send_msg(SILC_SERVER_REC *server, char *nick, char *msg) { PRIVMSG_REC *rec; - SilcClientEntry client_entry; - uint32 num = 0; - char *nickname = NULL, *serv = NULL; - - if (!silc_parse_nickname(nick, &nickname, &serv, &num)) { + SilcClientEntry *clients; + uint32 clients_count; + char *nickname = NULL; + + if (!silc_parse_userfqdn(nick, &nickname, NULL)) { printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP, SILCTXT_BAD_NICK, nick); return; } /* Find client entry */ - client_entry = silc_idlist_get_client(silc_client, server->conn, - nickname, serv, num, FALSE); - if (!client_entry) { + clients = silc_client_get_clients_local(silc_client, server->conn, + nickname, nick, &clients_count); + silc_free(nickname); + + if (!clients) { rec = g_new0(PRIVMSG_REC, 1); rec->nick = g_strdup(nick); rec->msg = g_strdup(msg); + rec->server = server; /* Could not find client with that nick, resolve it from server. */ silc_client_get_clients(silc_client, server->conn, - nickname, serv, silc_send_msg_clients, rec); + nickname, NULL, silc_send_msg_clients, rec); return; } /* Send the private message directly */ - silc_client_send_private_message(silc_client, server->conn, client_entry, 0, - msg, strlen(msg), TRUE); + silc_client_send_private_message(silc_client, server->conn, + clients[0], 0, msg, strlen(msg), TRUE); } static int isnickflag_func(char flag) @@ -252,20 +277,20 @@ char *silc_server_get_channels(SILC_SERVER_REC *server) /* SYNTAX: BAN [+|-[[@[![@hostname>]]]]] */ /* SYNTAX: CMODE +|- [{ }] */ -/* SYNTAX: CUMODE +|- [@] [-pubkey|] */ -/* SYNTAX: GETKEY */ -/* SYNTAX: INVITE [[@server>] */ +/* SYNTAX: CUMODE +|- [@] [-pubkey|] */ +/* SYNTAX: GETKEY */ +/* SYNTAX: INVITE [[@hostname>] */ /* SYNTAX: INVITE [+|-[[@[![@hostname>]]]]] */ /* SYNTAX: KEY MSG set|unset|list|agreement|negotiate [] */ /* SYNTAX: KEY CHANNEL set|unset|list|agreement|negotiate [] */ -/* SYNTAX: KICK [@] [] */ -/* SYNTAX: KILL [@] [] */ -/* SYNTAX: OPER [] */ -/* SYNTAX: SILCOPER [] */ -/* SYNTAX: TOPIC [ */ +/* SYNTAX: KICK [@] [] */ +/* SYNTAX: KILL [@] [] */ +/* SYNTAX: OPER [-pubkey] */ +/* SYNTAX: SILCOPER [-pubkey] */ +/* SYNTAX: TOPIC [] */ /* SYNTAX: UMODE +|- */ -/* SYNTAX: WHOIS [@] [] */ -/* SYNTAX: WHOWAS [@] [] */ +/* SYNTAX: WHOIS [@] [] */ +/* SYNTAX: WHOWAS [@] [] */ /* SYNTAX: CLOSE [] */ /* SYNTAX: SHUTDOWN */ /* SYNTAX: MOTD [] */ @@ -277,7 +302,7 @@ char *silc_server_get_channels(SILC_SERVER_REC *server) /* SYNTAX: NICK */ /* SYNTAX: NOTICE */ /* SYNTAX: PART [] */ -/* SYNTAX: PING [] */ +/* SYNTAX: PING */ /* SYNTAX: SCONNECT [] */ /* SYNTAX: USERS */ @@ -318,7 +343,7 @@ void silc_command_exec(SILC_SERVER_REC *server, ctx->argv_types = argv_types; /* Execute command */ - (*cmd->cb)(ctx); + (*cmd->cb)(ctx, NULL); } /* Generic command function to call any SILC command directly. */