libpurple/protocols/irc/cmds.c

changeset 35972
04fa195c585c
parent 35499
c4c5e0a670b1
parent 35925
3edc70bf4e09
child 36079
2e449140fe0b
equal deleted inserted replaced
35969:9571912ae4fc 35972:04fa195c585c
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')

mercurial