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