libpurple/protocols/irc/cmds.c

branch
release-2.x.y
changeset 35925
3edc70bf4e09
parent 31294
73607ab89c6f
child 35972
04fa195c585c
child 37954
b76dd48063d6
equal deleted inserted replaced
35693:61c9fdaa71df 35925:3edc70bf4e09
96 int irc_cmd_ctcp_action(struct irc_conn *irc, const char *cmd, const char *target, const char **args) 96 int irc_cmd_ctcp_action(struct irc_conn *irc, const char *cmd, const char *target, const char **args)
97 { 97 {
98 PurpleConnection *gc = purple_account_get_connection(irc->account); 98 PurpleConnection *gc = purple_account_get_connection(irc->account);
99 char *action, *escaped, *dst, **newargs; 99 char *action, *escaped, *dst, **newargs;
100 const char *src; 100 const char *src;
101 char *msg;
101 PurpleConversation *convo; 102 PurpleConversation *convo;
102 103
103 if (!args || !args[0] || !gc) 104 if (!args || !args[0] || !gc)
104 return 0; 105 return 0;
105 106
106 action = g_malloc(strlen(args[0]) + 10); 107 convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY,
107 108 target, irc->account);
108 sprintf(action, "\001ACTION "); 109
109 110 msg = g_strdup_printf("/me %s", args[0]);
110 src = args[0]; 111
111 dst = action + 8; 112 /* XXX: we'd prefer to keep this in conversation.c */
112 while (*src) { 113 if (purple_conversation_get_type(convo) == PURPLE_CONV_TYPE_IM) {
113 if (*src == '\n') { 114 purple_signal_emit(purple_conversations_get_handle(),
114 if (*(src + 1) == '\0') { 115 "sending-im-msg", irc->account,
115 break; 116 purple_conversation_get_name(convo), &msg);
116 } else { 117 } else {
117 *dst++ = ' '; 118 purple_signal_emit(purple_conversations_get_handle(),
118 src++; 119 "sending-chat-msg", irc->account, &msg,
119 continue; 120 purple_conv_chat_get_id(PURPLE_CONV_CHAT(convo)));
121 }
122
123 if (!msg || !msg[0]) {
124 g_free(msg);
125 return 0;
126 }
127
128 if (strncmp(msg, "/me ", 4) != 0) {
129 newargs = g_new0(char *, 2);
130 newargs[0] = g_strdup(target);
131 newargs[1] = msg;
132
133 irc_cmd_privmsg(irc, cmd, target, (const char **)newargs);
134
135 g_free(newargs[0]);
136 g_free(newargs);
137 } else {
138 action = g_malloc(strlen(&msg[4]) + 10);
139
140 sprintf(action, "\001ACTION ");
141
142 src = &msg[4];
143 dst = action + 8;
144 while (*src) {
145 if (*src == '\n') {
146 if (*(src + 1) == '\0') {
147 break;
148 } else {
149 *dst++ = ' ';
150 src++;
151 continue;
152 }
120 } 153 }
154 *dst++ = *src++;
121 } 155 }
122 *dst++ = *src++; 156 *dst++ = '\001';
123 } 157 *dst = '\0';
124 *dst++ = '\001'; 158
125 *dst = '\0'; 159 newargs = g_new0(char *, 2);
126 160 newargs[0] = g_strdup(target);
127 newargs = g_new0(char *, 2); 161 newargs[1] = action;
128 newargs[0] = g_strdup(target); 162 irc_cmd_privmsg(irc, cmd, target, (const char **)newargs);
129 newargs[1] = action; 163 g_free(newargs[0]);
130 irc_cmd_privmsg(irc, cmd, target, (const char **)newargs); 164 g_free(newargs);
131 g_free(newargs[0]); 165 g_free(action);
132 g_free(newargs[1]); 166 }
133 g_free(newargs); 167
134 168 /* XXX: we'd prefer to keep this in conversation.c */
135 convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, target, irc->account); 169 if (purple_conversation_get_type(convo) == PURPLE_CONV_TYPE_IM) {
170 purple_signal_emit(purple_conversations_get_handle(),
171 "sent-im-msg", irc->account,
172 purple_conversation_get_name(convo), msg);
173 } else {
174 purple_signal_emit(purple_conversations_get_handle(),
175 "sent-chat-msg", irc->account, msg,
176 purple_conv_chat_get_id(PURPLE_CONV_CHAT(convo)));
177 }
178
179 g_free(msg);
180
136 if (convo) { 181 if (convo) {
137 escaped = g_markup_escape_text(args[0], -1); 182 escaped = g_markup_escape_text(args[0], -1);
138 action = g_strdup_printf("/me %s", escaped); 183 action = g_strdup_printf("/me %s", escaped);
139 g_free(escaped); 184 g_free(escaped);
140 if (action[strlen(action) - 1] == '\n') 185 if (action[strlen(action) - 1] == '\n')

mercurial