summaryrefslogtreecommitdiff
path: root/libpurple/protocols/irc/cmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpurple/protocols/irc/cmds.c')
-rw-r--r--libpurple/protocols/irc/cmds.c792
1 files changed, 0 insertions, 792 deletions
diff --git a/libpurple/protocols/irc/cmds.c b/libpurple/protocols/irc/cmds.c
deleted file mode 100644
index 2709247e46..0000000000
--- a/libpurple/protocols/irc/cmds.c
+++ /dev/null
@@ -1,792 +0,0 @@
-/**
- * purple
- *
- * Copyright (C) 2003, Ethan Blanton <eblanton@cs.purdue.edu>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
- */
-
-#include <glib/gi18n-lib.h>
-
-#include <purple.h>
-
-#include "irc.h"
-
-
-static void irc_do_mode(struct irc_conn *irc, const char *target, const char *sign, char **ops);
-
-int
-irc_cmd_default(struct irc_conn *irc, const char *cmd, const char *target,
- G_GNUC_UNUSED const char **args)
-{
- PurpleConversation *convo;
- PurpleConversationManager *manager;
- char *buf;
-
- manager = purple_conversation_manager_get_default();
- convo = purple_conversation_manager_find(manager, irc->account, target);
-
- if (!convo) {
- return 1;
- }
-
- buf = g_strdup_printf(_("Unknown command: %s"), cmd);
- purple_conversation_write_system_message(convo, buf, PURPLE_MESSAGE_NO_LOG);
- g_free(buf);
-
- return 1;
-}
-
-int
-irc_cmd_away(struct irc_conn *irc, const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- char *buf, *message;
-
- if (args[0] && !purple_strequal(cmd, "back")) {
- message = purple_markup_strip_html(args[0]);
- purple_util_chrreplace(message, '\n', ' ');
- buf = irc_format(irc, "v:", "AWAY", message);
- g_free(message);
- } else {
- buf = irc_format(irc, "v", "AWAY");
- }
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_ctcp(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- /* we have defined args as args[0] is target and args[1] is ctcp command */
- char *buf;
- GString *string;
-
- /* check if we have args */
- if (!args || !args[0] || !args[1])
- return 0;
-
- /* TODO:strip newlines or send each line as separate ctcp or something
- * actually, this shouldn't be done here but somewhere else since irc should support escaping newlines */
-
- string = g_string_new(args[1]);
- g_string_prepend_c (string,'\001');
- g_string_append_c (string,'\001');
- buf = irc_format(irc, "vn:", "PRIVMSG", args[0], string->str);
- g_string_free(string,TRUE);
-
- irc_send(irc, buf);
- g_free(buf);
-
- return 1;
-}
-
-int irc_cmd_ctcp_action(struct irc_conn *irc, const char *cmd, const char *target, const char **args)
-{
- PurpleConnection *gc = purple_account_get_connection(irc->account);
- gchar *action, *escaped, *dst, **newargs;
- const gchar *src, *me;
- gchar *msg;
- PurpleContactInfo *info = NULL;
- PurpleConversation *convo;
- PurpleConversationManager *manager;
- PurpleMessage *pmsg;
-
- if (!args || !args[0] || !gc) {
- return 0;
- }
-
- info = PURPLE_CONTACT_INFO(irc->account);
- me = purple_contact_info_get_name_for_display(info);
-
- manager = purple_conversation_manager_get_default();
- convo = purple_conversation_manager_find(manager, irc->account, target);
-
- msg = g_strdup_printf("/me %s", args[0]);
-
- /* XXX: we'd prefer to keep this in conversation.c */
- if (PURPLE_IS_IM_CONVERSATION(convo)) {
- const gchar *conv_name = purple_conversation_get_name(convo);
- pmsg = purple_message_new_outgoing(irc->account, me, conv_name, msg,
- 0);
-
- purple_signal_emit(purple_conversations_get_handle(),
- "sending-im-msg", irc->account, pmsg);
- } else {
- pmsg = purple_message_new_outgoing(irc->account, me, NULL, msg, 0);
-
- purple_signal_emit(purple_conversations_get_handle(),
- "sending-chat-msg", irc->account, pmsg,
- purple_chat_conversation_get_id(PURPLE_CHAT_CONVERSATION(convo)));
- }
-
- /* We free the original message because it could have been changed by the
- * sending-*-msg signals above.
- */
- g_free(msg);
-
- /* if the message was eaten by a signal we bail */
- if(purple_message_is_empty(pmsg)) {
- g_object_unref(G_OBJECT(pmsg));
-
- return 0;
- }
-
- /* create a copy of the updated message, which should not be null because
- * we just tested if it was empty in the above conditional.
- */
- msg = g_strdup(purple_message_get_contents(pmsg));
-
- if (strncmp(msg, "/me ", 4) != 0) {
- newargs = g_new0(char *, 2);
- newargs[0] = g_strdup(target);
- newargs[1] = msg;
-
- irc_cmd_privmsg(irc, cmd, target, (const char **)newargs);
-
- g_free(newargs[0]);
- g_free(newargs);
- } else {
- action = g_malloc(strlen(&msg[4]) + 10);
-
- sprintf(action, "\001ACTION ");
-
- src = &msg[4];
- dst = action + 8;
- while (*src) {
- if (*src == '\n') {
- if (*(src + 1) == '\0') {
- break;
- } else {
- *dst++ = ' ';
- src++;
- continue;
- }
- }
- *dst++ = *src++;
- }
- *dst++ = '\001';
- *dst = '\0';
-
- newargs = g_new0(char *, 2);
- newargs[0] = g_strdup(target);
- newargs[1] = action;
- irc_cmd_privmsg(irc, cmd, target, (const char **)newargs);
- g_free(newargs[0]);
- g_free(newargs);
- g_free(action);
- }
-
- /* XXX: we'd prefer to keep this in conversation.c */
- if (PURPLE_IS_IM_CONVERSATION(convo)) {
- purple_signal_emit(purple_conversations_get_handle(),
- "sent-im-msg", irc->account, pmsg);
- } else {
- purple_signal_emit(purple_conversations_get_handle(),
- "sent-chat-msg", irc->account, pmsg,
- purple_chat_conversation_get_id(PURPLE_CHAT_CONVERSATION(convo)));
- }
-
- g_free(msg);
-
- if (convo) {
- escaped = g_markup_escape_text(args[0], -1);
- action = g_strdup_printf("/me %s", escaped);
- g_free(escaped);
- if (action[strlen(action) - 1] == '\n') {
- action[strlen(action) - 1] = '\0';
- }
- if (PURPLE_IS_CHAT_CONVERSATION(convo)) {
- purple_serv_got_chat_in(gc, purple_chat_conversation_get_id(PURPLE_CHAT_CONVERSATION(convo)),
- purple_connection_get_display_name(gc),
- PURPLE_MESSAGE_SEND, action, time(NULL));
- } else {
- purple_message_set_recipient(pmsg,
- purple_connection_get_display_name(gc));
- purple_conversation_write_message(convo, pmsg);
- }
- g_free(action);
- }
-
- g_object_unref(G_OBJECT(pmsg));
-
- return 1;
-}
-
-int
-irc_cmd_ctcp_version(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- char *buf;
-
- if (!args || !args[0])
- return 0;
-
- buf = irc_format(irc, "vn:", "PRIVMSG", args[0], "\001VERSION\001");
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_invite(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- const char *target, const char **args)
-{
- char *buf;
-
- if (!args || !args[0] || !(args[1] || target))
- return 0;
-
- buf = irc_format(irc, "vnc", "INVITE", args[0], args[1] ? args[1] : target);
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_join(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- char *buf;
-
- if (!args || !args[0])
- return 0;
-
- if (args[1])
- buf = irc_format(irc, "vcv", "JOIN", args[0], args[1]);
- else
- buf = irc_format(irc, "vc", "JOIN", args[0]);
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_kick(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- const char *target, const char **args)
-{
- PurpleConversationManager *manager;
- char *buf;
-
- if(!args || !args[0]) {
- return 0;
- }
-
- manager = purple_conversation_manager_get_default();
- if(!purple_conversation_manager_find_chat(manager, irc->account, target)) {
- return 0;
- }
-
- if(args[1]) {
- buf = irc_format(irc, "vcn:", "KICK", target, args[0], args[1]);
- } else {
- buf = irc_format(irc, "vcn", "KICK", target, args[0]);
- }
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_list(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- G_GNUC_UNUSED const char *target, G_GNUC_UNUSED const char **args)
-{
- purple_roomlist_show_with_account(irc->account);
-
- return 0;
-}
-
-int irc_cmd_mode(struct irc_conn *irc, const char *cmd, const char *target, const char **args)
-{
- PurpleConnection *gc;
- char *buf;
-
- if (!args)
- return 0;
-
- if (purple_strequal(cmd, "mode")) {
- if (!args[0] && irc_ischannel(target))
- buf = irc_format(irc, "vc", "MODE", target);
- else if (args[0] && (*args[0] == '+' || *args[0] == '-'))
- buf = irc_format(irc, "vcn", "MODE", target, args[0]);
- else if (args[0])
- buf = irc_format(irc, "vn", "MODE", args[0]);
- else
- return 0;
- } else if (purple_strequal(cmd, "umode")) {
- if (!args[0])
- return 0;
- gc = purple_account_get_connection(irc->account);
- buf = irc_format(irc, "vnc", "MODE", purple_connection_get_display_name(gc), args[0]);
- } else {
- return 0;
- }
-
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_names(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- const char *target, const char **args)
-{
- char *buf;
-
- if (!args || (!args[0] && !irc_ischannel(target)))
- return 0;
-
- buf = irc_format(irc, "vc", "NAMES", args[0] ? args[0] : target);
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_nick(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- char *buf;
-
- if (!args || !args[0])
- return 0;
-
- buf = irc_format(irc, "v:", "NICK", args[0]);
- g_free(irc->reqnick);
- irc->reqnick = g_strdup(args[0]);
- irc->nickused = FALSE;
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int irc_cmd_op(struct irc_conn *irc, const char *cmd, const char *target, const char **args)
-{
- char **nicks, **ops, *sign, *mode;
- int i = 0, used = 0;
-
- if (!args || !args[0] || !*args[0])
- return 0;
-
- if (purple_strequal(cmd, "op")) {
- sign = "+";
- mode = "o";
- } else if (purple_strequal(cmd, "deop")) {
- sign = "-";
- mode = "o";
- } else if (purple_strequal(cmd, "voice")) {
- sign = "+";
- mode = "v";
- } else if (purple_strequal(cmd, "devoice")) {
- sign = "-";
- mode = "v";
- } else {
- purple_debug_error("irc", "invalid 'op' command '%s'", cmd);
- return 0;
- }
-
- nicks = g_strsplit(args[0], " ", -1);
-
- for (i = 0; nicks[i]; i++)
- /* nothing */;
- ops = g_new0(char *, i * 2 + 1);
-
- for (i = 0; nicks[i]; i++) {
- if (*nicks[i]) {
- ops[used++] = mode;
- ops[used++] = nicks[i];
- }
- }
-
- irc_do_mode(irc, target, sign, ops);
- g_free(ops);
- g_strfreev(nicks);
-
- return 0;
-}
-
-int
-irc_cmd_part(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- const char *target, const char **args)
-{
- char *buf;
-
- if (!args)
- return 0;
-
- if (args[1])
- buf = irc_format(irc, "vc:", "PART", args[0] ? args[0] : target, args[1]);
- else
- buf = irc_format(irc, "vc", "PART", args[0] ? args[0] : target);
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_ping(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- const char *target, const char **args)
-{
- char *stamp;
- char *buf;
-
- if (args && args[0]) {
- if (irc_ischannel(args[0]))
- return 0;
- stamp = g_strdup_printf("\001PING %" G_GINT64_FORMAT "\001",
- g_get_monotonic_time());
- buf = irc_format(irc, "vn:", "PRIVMSG", args[0], stamp);
- g_free(stamp);
- } else if (target) {
- stamp = g_strdup_printf("%s %" G_GINT64_FORMAT, target,
- g_get_monotonic_time());
- buf = irc_format(irc, "v:", "PING", stamp);
- g_free(stamp);
- } else {
- stamp = g_strdup_printf("%" G_GUINT64_FORMAT, g_get_monotonic_time());
- buf = irc_format(irc, "vv", "PING", stamp);
- g_free(stamp);
- }
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_privmsg(struct irc_conn *irc, const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- int max_privmsg_arg_len;
- const char *cur, *end;
- gchar *salvaged;
- char *msg, *buf;
-
- if (!args || !args[0] || !args[1])
- return 0;
-
- max_privmsg_arg_len = IRC_MAX_MSG_SIZE - strlen(args[0]) - 64;
- salvaged = g_utf8_make_valid(args[1], -1);
- cur = salvaged;
- end = salvaged;
- while (*end && *cur) {
- end = strchr(cur, '\n');
- if (!end)
- end = cur + strlen(cur);
- if (end - cur > max_privmsg_arg_len) {
- /* this call is used to find the last valid character position in the first
- * max_privmsg_arg_len bytes of the utf-8 message
- */
- g_utf8_validate(cur, max_privmsg_arg_len, &end);
- }
-
- msg = g_strndup(cur, end - cur);
-
- if(purple_strequal(cmd, "notice"))
- buf = irc_format(irc, "vt:", "NOTICE", args[0], msg);
- else
- buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg);
-
- irc_send(irc, buf);
- g_free(msg);
- g_free(buf);
- cur = end;
- if(*cur == '\n') {
- cur++;
- }
- }
-
- g_free(salvaged);
-
- return 0;
-}
-
-int
-irc_cmd_quit(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- char *buf;
-
- if (!irc->quitting) {
- /*
- * Use purple_account_get_string(irc->account, "quitmsg", IRC_DEFAULT_QUIT)
- * and uncomment the appropriate account preference in irc.c if we
- * decide we want custom quit messages.
- */
- buf = irc_format(irc, "v:", "QUIT", (args && args[0]) ? args[0] : IRC_DEFAULT_QUIT);
- irc_send(irc, buf);
- g_free(buf);
-
- irc->quitting = TRUE;
-
- if (!purple_account_is_disconnecting(irc->account))
- purple_account_set_status(irc->account, "offline", TRUE, NULL);
- }
-
- return 0;
-}
-
-int
-irc_cmd_quote(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- char *buf;
-
- if (!args || !args[0])
- return 0;
-
- buf = irc_format(irc, "n", args[0]);
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int irc_cmd_query(struct irc_conn *irc, const char *cmd, const char *target, const char **args)
-{
- PurpleConversation *im;
- PurpleConnection *gc;
-
- if (!args || !args[0])
- return 0;
-
- im = purple_im_conversation_new(irc->account, args[0]);
- purple_conversation_present(im);
-
- if (args[1]) {
- PurpleMessage *message = NULL;
- PurpleContactInfo *info = PURPLE_CONTACT_INFO(irc->account);
- const gchar *me = NULL;
- const gchar *recipient = NULL;
-
- gc = purple_account_get_connection(irc->account);
- irc_cmd_privmsg(irc, cmd, target, args);
-
- me = purple_contact_info_get_name_for_display(info);
- recipient = purple_connection_get_display_name(gc);
- message = purple_message_new_outgoing(irc->account, me, recipient,
- args[1], 0);
-
- purple_conversation_write_message(im, message);
-
- g_object_unref(G_OBJECT(message));
- }
-
- return 0;
-}
-
-int
-irc_cmd_remove(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- const char *target, const char **args)
-{
- char *buf;
-
- if (!args || !args[0])
- return 0;
-
- if (!irc_ischannel(target)) /* not a channel, punt */
- return 0;
-
- if (args[1])
- buf = irc_format(irc, "vcn:", "REMOVE", target, args[0], args[1]);
- else
- buf = irc_format(irc, "vcn", "REMOVE", target, args[0]);
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_service(struct irc_conn *irc, const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- char *capital_cmd, *buf;
-
- if (!args || !args[0])
- return 0;
-
- /* cmd will be one of nickserv, chanserv, memoserv or operserv */
- capital_cmd = g_ascii_strup(cmd, -1);
- buf = irc_format(irc, "v:", capital_cmd, args[0]);
- irc_send(irc, buf);
- g_free(capital_cmd);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_time(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- G_GNUC_UNUSED const char *target, G_GNUC_UNUSED const char **args)
-{
- char *buf;
-
- buf = irc_format(irc, "v", "TIME");
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_topic(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- const char *target, const char **args)
-{
- PurpleConversation *chat;
- PurpleConversationManager *manager;
- char *buf;
- const char *topic;
-
- if (!args) {
- return 0;
- }
-
- manager = purple_conversation_manager_get_default();
- chat = purple_conversation_manager_find_chat(manager, irc->account, target);
- if (!chat) {
- return 0;
- }
-
- if (!args[0]) {
- topic = purple_chat_conversation_get_topic (PURPLE_CHAT_CONVERSATION(chat));
-
- if (topic) {
- char *tmp, *tmp2;
- tmp = g_markup_escape_text(topic, -1);
- tmp2 = purple_markup_linkify(tmp);
- buf = g_strdup_printf(_("current topic is: %s"), tmp2);
- g_free(tmp);
- g_free(tmp2);
- } else
- buf = g_strdup(_("No topic is set"));
- purple_conversation_write_system_message(
- chat, buf, PURPLE_MESSAGE_NO_LOG);
- g_free(buf);
-
- return 0;
- }
-
- buf = irc_format(irc, "vt:", "TOPIC", target, args[0]);
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_wallops(struct irc_conn *irc, const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- char *buf;
-
- if (!args || !args[0])
- return 0;
-
- if (purple_strequal(cmd, "wallops"))
- buf = irc_format(irc, "v:", "WALLOPS", args[0]);
- else if (purple_strequal(cmd, "operwall"))
- buf = irc_format(irc, "v:", "OPERWALL", args[0]);
- else
- return 0;
-
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_whois(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- char *buf;
-
- if (!args || !args[0])
- return 0;
-
- if (args[1]) {
- buf = irc_format(irc, "vvn", "WHOIS", args[0], args[1]);
- irc->whois.nick = g_strdup(args[1]);
- } else {
- buf = irc_format(irc, "vn", "WHOIS", args[0]);
- irc->whois.nick = g_strdup(args[0]);
- }
-
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-int
-irc_cmd_whowas(struct irc_conn *irc, G_GNUC_UNUSED const char *cmd,
- G_GNUC_UNUSED const char *target, const char **args)
-{
- char *buf;
-
- if (!args || !args[0])
- return 0;
-
- buf = irc_format(irc, "vn", "WHOWAS", args[0]);
-
- irc->whois.nick = g_strdup(args[0]);
- irc_send(irc, buf);
- g_free(buf);
-
- return 0;
-}
-
-static void irc_do_mode(struct irc_conn *irc, const char *target, const char *sign, char **ops)
-{
- char *buf, mode[5];
- int i = 0;
-
- if (!sign)
- return;
-
- while (ops[i]) {
- if (ops[i + 2] && ops[i + 4]) {
- g_snprintf(mode, sizeof(mode), "%s%s%s%s", sign,
- ops[i], ops[i + 2], ops[i + 4]);
- buf = irc_format(irc, "vcvnnn", "MODE", target, mode,
- ops[i + 1], ops[i + 3], ops[i + 5]);
- i += 6;
- } else if (ops[i + 2]) {
- g_snprintf(mode, sizeof(mode), "%s%s%s",
- sign, ops[i], ops[i + 2]);
- buf = irc_format(irc, "vcvnn", "MODE", target, mode,
- ops[i + 1], ops[i + 3]);
- i += 4;
- } else {
- g_snprintf(mode, sizeof(mode), "%s%s", sign, ops[i]);
- buf = irc_format(irc, "vcvn", "MODE", target, mode, ops[i + 1]);
- i += 2;
- }
- irc_send(irc, buf);
- g_free(buf);
- }
-}