Now .exe extension is used only when building on windoze
[mirrors/libpurple-core-answerscripts.git] / answerscripts.c
CommitLineData
73f7c2ff 1//#define __WIN32__
058e63ec
H
2#ifndef __WIN32__
3 #define ANSWERSCRIPT_EXT ""
4#else
5 #define ANSWERSCRIPT_EXT ".exe"
6#endif
7#define ANSWERSCRIPT "answerscripts" ANSWERSCRIPT_EXT
53478f8c
H
8#define ANSWERSCRIPTS_TIMEOUT_INTERVAL 250
9#define ANSWERSCRIPTS_LINE_LENGTH 4096
b44d7b66
H
10
11#include <stdio.h>
12#include <stdlib.h>
81749a99 13#include <errno.h>
b44d7b66 14
81749a99
H
15#ifndef __WIN32__
16 #include <fcntl.h>
17#endif
18
53478f8c
H
19/* Purple plugin */
20#define PURPLE_PLUGINS
21#include <libpurple/debug.h>
22#include <libpurple/version.h>
23#include <libpurple/conversation.h>
24#include <libpurple/plugin.h>
25#include <libpurple/signals.h>
26#include <libpurple/util.h>
73f7c2ff 27
b44d7b66
H
28char *buff = NULL;
29char *hook_script = NULL;
6ec3c19f 30char response[ANSWERSCRIPTS_LINE_LENGTH+1];
b44d7b66
H
31int i;
32
6ec3c19f
H
33typedef struct {
34 FILE *pipe;
35 PurpleConversation *conv;
36} answerscripts_job;
37
81749a99 38int answerscripts_process_message_cb(answerscripts_job *job) {
6ec3c19f
H
39 FILE *pipe = job->pipe;
40 PurpleConversation *conv = job->conv;
41
81749a99
H
42 if (pipe && !feof(pipe)) {
43 if(!fgets(response, ANSWERSCRIPTS_LINE_LENGTH, pipe)
44 && (errno == EWOULDBLOCK || errno == EAGAIN)
45 ) return 1;
46
d852a694 47 for(i=0;response[i];i++) if(response[i]=='\n') response[i]=0;
6ec3c19f 48 purple_conv_im_send(purple_conversation_get_im_data(conv), response);
81749a99
H
49
50 if(!feof(pipe)) return 1;
d852a694
H
51 }
52 pclose(pipe);
6ec3c19f
H
53 free(job);
54 return 0;
d852a694
H
55}
56
73f7c2ff
H
57static void received_im_msg_cb(PurpleAccount *account, char *who, char *buffer, PurpleConversation *conv, PurpleMessageFlags flags, void *data) {
58 if (conv == NULL) conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, who); //* A workaround to avoid skipping of the first message as a result on NULL-conv: */
b44d7b66
H
59
60 buff = purple_markup_strip_html(buffer);
61 //printf("\nHarvie received: %s: %s\n", who, buff); //debug
62 //purple_conv_im_send(purple_conversation_get_im_data(conv), ":-*"); //debug
63
64 setenv("PURPLE_FROM", who, 1);
65 setenv("PURPLE_MSG", buff, 1);
66
6ec3c19f
H
67
68 answerscripts_job *job = (answerscripts_job*) malloc(sizeof(answerscripts_job));
69 job->pipe = popen(hook_script, "r");
70 job->conv = conv;
71
81749a99
H
72 #ifndef __WIN32__
73 int fflags = fcntl(fileno(job->pipe), F_GETFL, 0);
74 fcntl(fileno(job->pipe), F_SETFL, fflags | O_NONBLOCK);
75 #endif
76
77 purple_timeout_add(ANSWERSCRIPTS_TIMEOUT_INTERVAL, (GSourceFunc) answerscripts_process_message_cb, (gpointer) job);
b44d7b66
H
78}
79
80
81static gboolean plugin_load(PurplePlugin * plugin) {
6ec3c19f 82 asprintf(&hook_script,"%s/%s",purple_user_dir(),ANSWERSCRIPT);
b44d7b66 83 void *conv_handle = purple_conversations_get_handle();
73f7c2ff 84 purple_signal_connect(conv_handle, "received-im-msg", plugin, PURPLE_CALLBACK(received_im_msg_cb), NULL);
53478f8c 85 return TRUE;
b44d7b66
H
86}
87
88static gboolean plugin_unload(PurplePlugin * plugin) {
89 free(hook_script);
53478f8c 90 return TRUE;
b44d7b66
H
91}
92
93static PurplePluginInfo info = {
94 PURPLE_PLUGIN_MAGIC,
95 PURPLE_MAJOR_VERSION,
96 PURPLE_MINOR_VERSION,
97 PURPLE_PLUGIN_STANDARD,
98 NULL,
99 0,
100 NULL,
101 PURPLE_PRIORITY_DEFAULT,
102
103 "core-answerscripts",
104 "AnswerScripts",
058e63ec 105 "0.2.2",
53478f8c
H
106 "Framework for hooking scripts to process received messages for libpurple clients",
107 "This plugin will execute script ~/.purple/" ANSWERSCRIPT " "
108 "or any other executable called " ANSWERSCRIPT " and found in purple_user_dir() "
109 "for each single instant message received.\n"
110 "\n- Envinronment values PURPLE_MSG and PURPLE_FROM will be set to carry "
111 "informations about message text and sender so script can respond to that message."
112 "\n- Any text printed to STDOUT by the script will be sent back as answer to message."
113 "\n\nPlease see example scripts, documentation or source code for more informations...",
b44d7b66 114 "Harvie <harvie@email.cz>",
53478f8c 115 "http://github.com/harvie/libpurple-core-answerscripts",
b44d7b66
H
116
117 plugin_load,
118 plugin_unload,
119 NULL,
120 NULL,
121 NULL,
122 NULL,
123 NULL,
124 NULL,
125 NULL,
126 NULL,
127 NULL
128};
129
130static void init_plugin(PurplePlugin * plugin) {
131
132}
133
134PURPLE_INIT_PLUGIN(autoanswer, init_plugin, info)
This page took 0.222759 seconds and 4 git commands to generate.