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