Mercurial > pidgin.yaz
diff src/protocols/silc/silc.c @ 9488:2770a0e659ca
[gaim-migrate @ 10313]
Stu Tomlinson assures me that this is a bunch of new and fancy
features for SILC that we really need. I believe him because his name
is pronounceable backward. This is from Patch #975859, and
additionally fixes bug #981066 and mitigates #981080. We love you, Stu.
committer: Tailor Script <tailor@pidgin.im>
author | Ethan Blanton <elb@pidgin.im> |
---|---|
date | Thu, 08 Jul 2004 18:45:01 +0000 |
parents | d27156c9c876 |
children | 2e057acae3ab |
line wrap: on
line diff
--- a/src/protocols/silc/silc.c Thu Jul 08 17:37:33 2004 +0000 +++ b/src/protocols/silc/silc.c Thu Jul 08 18:45:01 2004 +0000 @@ -715,6 +715,7 @@ { GaimConnection *gc = (GaimConnection *) action->context; SilcGaim sg; + char *tmp; if (!gc) return; @@ -729,8 +730,10 @@ return; } - gaim_notify_formatted(gc, _("Message of the Day"), _("Message of the Day"), NULL, - sg->motd, NULL, NULL); + tmp = gaim_escape_html(sg->motd); + gaim_notify_formatted(gc, NULL, _("Message of the Day"), NULL, + tmp, NULL, NULL); + g_free(tmp); } static void @@ -955,8 +958,10 @@ } else convo = conv; - if (gaim_conversation_get_type(convo) != GAIM_CONV_CHAT) + if (gaim_conversation_get_type(convo) != GAIM_CONV_CHAT) { + *error = g_strdup(_("Failed to leave channel")); return GAIM_CMD_RET_FAILED; + } id = gaim_conv_chat_get_id(GAIM_CONV_CHAT(convo)); @@ -974,6 +979,8 @@ { GaimConnection *gc; int id = 0; + char *buf, *tmp; + const char *topic; gc = gaim_conversation_get_gc(conv); id = gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv)); @@ -981,6 +988,25 @@ if (gc == NULL || id == 0) return GAIM_CMD_RET_FAILED; + if (!args || !args[0]) { + topic = gaim_conv_chat_get_topic (GAIM_CONV_CHAT(conv)); + if (topic) { + tmp = gaim_escape_html(topic); + buf = g_strdup_printf(_("current topic is: %s"), tmp); + g_free(tmp); + } else + buf = g_strdup(_("No topic is set")); + gaim_conv_chat_write(GAIM_CONV_CHAT(conv), gc->account->username, buf, + GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); + g_free(buf); + + } + + if (args && args[0] && (strlen(args[0]) > 255)) { + *error = g_strdup(_("Topic too long")); + return GAIM_CMD_RET_FAILED; + } + silcgaim_chat_set_topic(gc, id, args ? args[0] : NULL); return GAIM_CMD_RET_OK; @@ -1057,8 +1083,10 @@ GaimConnection *gc; GaimAccount *account; - if (!args || !args[0]) + if (!args || !args[0]) { + *error = g_strdup(_("You must specify a nick")); return GAIM_CMD_RET_FAILED; + } gc = gaim_conversation_get_gc(conv); @@ -1086,6 +1114,7 @@ { GaimConnection *gc; SilcGaim sg; + char *tmp; gc = gaim_conversation_get_gc(conv); @@ -1098,13 +1127,14 @@ return GAIM_CMD_RET_FAILED; if (!sg->motd) { - gaim_notify_error(gc, _("Message of the Day"), _("No Message of the Day available"), - _("There is no Message of the Day associated with this connection")); + *error = g_strdup(_("There is no Message of the Day associated with this connection")); return GAIM_CMD_RET_FAILED; } - gaim_notify_formatted(gc, _("Message of the Day"), _("Message of the Day"), NULL, - sg->motd, NULL, NULL); + tmp = gaim_escape_html(sg->motd); + gaim_notify_formatted(gc, NULL, _("Message of the Day"), NULL, + tmp, NULL, NULL); + g_free(tmp); return GAIM_CMD_RET_OK; } @@ -1131,6 +1161,59 @@ return GAIM_CMD_RET_OK; } +static GaimCmdRet silcgaim_cmd_cmode(GaimConversation *conv, + const char *cmd, char **args, char **error) +{ + GaimConnection *gc; + SilcGaim sg; + SilcChannelEntry channel; + char *silccmd, *silcargs, *msg, tmp[256]; + const char *chname; + + gc = gaim_conversation_get_gc(conv); + + if (gc == NULL || !args || gc->proto_data == NULL) + return GAIM_CMD_RET_FAILED; + + sg = gc->proto_data; + + if (args[0]) + chname = args[0]; + else + chname = gaim_conversation_get_name(conv); + + if (!args[1]) { + channel = silc_client_get_channel(sg->client, sg->conn, + (char *)chname); + if (!channel) { + *error = g_strdup_printf(_("channel %s not found"), chname); + return GAIM_CMD_RET_FAILED; + } + if (channel->mode) { + silcgaim_get_chmode_string(channel->mode, tmp, sizeof(tmp)); + msg = g_strdup_printf(_("channel modes for %s: %s"), chname, tmp); + } else { + msg = g_strdup_printf(_("no channel modes are set on %s"), chname); + } + gaim_conv_chat_write(GAIM_CONV_CHAT(conv), "", + msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL)); + g_free(msg); + return GAIM_CMD_RET_OK; + } + + silcargs = g_strjoinv(" ", args); + silccmd = g_strconcat(cmd, " ", args ? silcargs : NULL, NULL); + g_free(silcargs); + if (!silc_client_command_call(sg->client, sg->conn, silccmd)) { + g_free(silccmd); + *error = g_strdup_printf(_("Failed to set cmodes for %s"), args[0]); + return GAIM_CMD_RET_FAILED; + } + g_free(silccmd); + + return GAIM_CMD_RET_OK; +} + static GaimCmdRet silcgaim_cmd_generic(GaimConversation *conv, const char *cmd, char **args, char **error) { @@ -1153,6 +1236,7 @@ g_free(silcargs); if (!silc_client_command_call(sg->client, sg->conn, silccmd)) { g_free(silccmd); + *error = g_strdup_printf(_("Unknown command: %s, (may be a Gaim bug)"), cmd); return GAIM_CMD_RET_FAILED; } g_free(silccmd); @@ -1198,8 +1282,10 @@ if (sg == NULL) return GAIM_CMD_RET_FAILED; - if (!silc_client_command_call(sg->client, sg->conn, args[0])) + if (!silc_client_command_call(sg->client, sg->conn, args[0])) { + *error = g_strdup_printf(_("Unknown command: %s"), args[0]); return GAIM_CMD_RET_FAILED; + } return GAIM_CMD_RET_OK; } @@ -1213,11 +1299,11 @@ gaim_cmd_register("part", "w", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, - "prpl-silc", silcgaim_cmd_chat_part, _("part: Leave the chat")); + "prpl-silc", silcgaim_cmd_chat_part, _("part [channel]: Leave the chat")); gaim_cmd_register("leave", "w", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, - "prpl-silc", silcgaim_cmd_chat_part, _("leave: Leave the chat")); + "prpl-silc", silcgaim_cmd_chat_part, _("leave [channel]: Leave the chat")); gaim_cmd_register("topic", "s", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", @@ -1254,73 +1340,77 @@ gaim_cmd_register("quit", "s", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", silcgaim_cmd_quit, - ""); + _("quit [message]: Disconnect from the server, with an optional message")); gaim_cmd_register("call", "s", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY, "prpl-silc", silcgaim_cmd_call, - ""); + _("call <command>: Call any silc client command")); /* These below just get passed through for the silc client library to deal with */ gaim_cmd_register("kill", "ws", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", silcgaim_cmd_generic, - ""); + _("kill <nick> [-pubkey|<reason>]: Kill nick")); gaim_cmd_register("nick", "w", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY, "prpl-silc", silcgaim_cmd_generic, - ""); - gaim_cmd_register("cmode", "wws", GAIM_CMD_P_PRPL, + _("nick <newnick>: Change your nickname")); + gaim_cmd_register("whowas", "ww", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", silcgaim_cmd_generic, - ""); + _("whowas <nick>: View nick's information")); + gaim_cmd_register("cmode", "wws", GAIM_CMD_P_PRPL, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | + GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", silcgaim_cmd_cmode, + _("cmode <channel> [+|-<modes>]; [arguments]: Change or display channel modes")); gaim_cmd_register("cumode", "wws", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", silcgaim_cmd_generic, - ""); + _("cumode <channel> +|-<modes> <nick>: Change nick's modes on channel")); gaim_cmd_register("umode", "w", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY, "prpl-silc", silcgaim_cmd_generic, - _("umode <usermodes>: Set your user options")); + _("umode <usermodes>: Set your modes in the network")); gaim_cmd_register("oper", "s", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY, "prpl-silc", silcgaim_cmd_generic, - ""); + _("oper <nick> [-pubkey]: Get server operator privileges")); gaim_cmd_register("invite", "ws", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", silcgaim_cmd_generic, - ""); + _("invite <channel> [-|+]<nick>: invite nick or add/remove from channel invite list")); gaim_cmd_register("kick", "wws", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", silcgaim_cmd_generic, - ""); - gaim_cmd_register("info", "ww", GAIM_CMD_P_PRPL, + _("kick <channel> <nick> [comment]: Kick client from channel")); + gaim_cmd_register("info", "w", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", silcgaim_cmd_generic, - ""); + _("info [server]: View server administrative details")); gaim_cmd_register("ban", "ww", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", silcgaim_cmd_generic, - ""); + _("ban [<channel> +|-<nick>]: Ban client from channel")); + gaim_cmd_register("getkey", "w", GAIM_CMD_P_PRPL, + GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY, + "prpl-silc", silcgaim_cmd_generic, + _("getkey <nick|server>: Retrieve client's or server's public key")); + gaim_cmd_register("stats", "", GAIM_CMD_P_PRPL, + GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY, + "prpl-silc", silcgaim_cmd_generic, + _("stats: View server and network statistics")); gaim_cmd_register("ping", "", GAIM_CMD_P_PRPL, GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY, "prpl-silc", silcgaim_cmd_generic, - ""); -#if 0 /* Gaim doesn't handle the reply for these yet */ - gaim_cmd_register("stats", "", GAIM_CMD_P_PRPL, - GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY, - "prpl-silc", silcgaim_cmd_generic, - ""); - gaim_cmd_register("whowas", "ww", GAIM_CMD_P_PRPL, - GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | - GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", silcgaim_cmd_generic, - ""); - gaim_cmd_register("users", "s", GAIM_CMD_P_PRPL, - GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY, - "prpl-silc", silcgaim_cmd_generic, - ""); - gaim_cmd_register("getkey", "w", GAIM_CMD_P_PRPL, - GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY, - "prpl-silc", silcgaim_cmd_generic, - ""); + _("ping: Send PING to the connected server")); +#if 0 /* Gaim doesn't handle these yet */ + gaim_cmd_register("users", "w", GAIM_CMD_P_PRPL, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY, + "prpl-silc", silcgaim_cmd_users, + _("users <channel>: List users in channel")); + gaim_cmd_register("names", "ww", GAIM_CMD_P_PRPL, + GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_PRPL_ONLY | + GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-silc", silcgaim_cmd_names, + _("names [-count|-ops|-halfops|-voices|-normal] <channel(s)>: List specific users in channel(s)")); #endif } @@ -1384,61 +1474,61 @@ GAIM_PRPL_API_VERSION, OPT_PROTO_CHAT_TOPIC | OPT_PROTO_UNIQUE_CHATNAME | OPT_PROTO_PASSWORD_OPTIONAL, - NULL, - NULL, - NO_BUDDY_ICONS, - silcgaim_list_icon, - silcgaim_list_emblems, - silcgaim_status_text, - silcgaim_tooltip_text, - silcgaim_away_states, - silcgaim_blist_node_menu, - silcgaim_chat_info, - silcgaim_login, - silcgaim_close, - silcgaim_send_im, - silcgaim_set_info, - NULL, - silcgaim_get_info, - silcgaim_set_away, - silcgaim_idle_set, - silcgaim_change_passwd, - silcgaim_add_buddy, - NULL, - silcgaim_remove_buddy, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - silcgaim_chat_join, - NULL, - silcgaim_chat_invite, - silcgaim_chat_leave, - NULL, - silcgaim_chat_send, - silcgaim_keepalive, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - silcgaim_chat_set_topic, - NULL, - silcgaim_roomlist_get_list, - silcgaim_roomlist_cancel, - NULL, - NULL, - silcgaim_ftp_send_file + NULL, /* user_splits */ + NULL, /* protocol_options */ + NO_BUDDY_ICONS, /* icon_spec */ + silcgaim_list_icon, /* list_icon */ + silcgaim_list_emblems, /* list_emblems */ + silcgaim_status_text, /* status_text */ + silcgaim_tooltip_text, /* tooltip_text */ + silcgaim_away_states, /* away_states */ + silcgaim_blist_node_menu, /* blist_node_menu */ + silcgaim_chat_info, /* chat_info */ + silcgaim_login, /* login */ + silcgaim_close, /* close */ + silcgaim_send_im, /* send_im */ + silcgaim_set_info, /* set_info */ + NULL, /* send_typing */ + silcgaim_get_info, /* get_info */ + silcgaim_set_away, /* set_away */ + silcgaim_idle_set, /* set_idle */ + silcgaim_change_passwd, /* change_passwd */ + silcgaim_add_buddy, /* add_buddy */ + NULL, /* add_buddies */ + silcgaim_remove_buddy, /* remove_buddy */ + NULL, /* remove_buddies */ + NULL, /* add_permit */ + NULL, /* add_deny */ + NULL, /* rem_permit */ + NULL, /* rem_deny */ + NULL, /* set_permit_deny */ + NULL, /* warn */ + silcgaim_chat_join, /* join_chat */ + NULL, /* reject_chat */ + silcgaim_chat_invite, /* chat_invite */ + silcgaim_chat_leave, /* chat_leave */ + NULL, /* chat_whisper */ + silcgaim_chat_send, /* chat_send */ + silcgaim_keepalive, /* keepalive */ + NULL, /* register_user */ + NULL, /* get_cb_info */ + NULL, /* get_cb_away */ + NULL, /* alias_buddy */ + NULL, /* group_buddy */ + NULL, /* rename_group */ + NULL, /* buddy_free */ + NULL, /* convo_closed */ + NULL, /* normalize */ + NULL, /* set_buddy_icon */ + NULL, /* remove_group */ + NULL, /* get_cb_real_name */ + silcgaim_chat_set_topic, /* set_chat_topic */ + NULL, /* find_blist_chat */ + silcgaim_roomlist_get_list, /* roomlist_get_list */ + silcgaim_roomlist_cancel, /* roomlist_cancel */ + NULL, /* roomlist_expand_category */ + NULL, /* can_receive_file */ + silcgaim_ftp_send_file /* send_file */ }; static GaimPluginInfo info =