| 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') |