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