| 1 #include "config.h" |
1 /* |
| 2 #include "gaim.h" |
2 ** Send commands to gaim via ~/.gaim/control |
| 3 |
3 ** |
| |
4 ** By Eric Warmenhoven <eric@warmenhoven.org> |
| |
5 ** compile fixes/mini hacks Alex Bennee <alex@bennee.com> |
| |
6 */ |
| |
7 |
| |
8 /* system includes */ |
| 4 #include <gtk/gtk.h> |
9 #include <gtk/gtk.h> |
| 5 #include <stdlib.h> |
10 #include <stdlib.h> |
| |
11 #include <stdio.h> |
| 6 #include <unistd.h> |
12 #include <unistd.h> |
| 7 #include <sys/types.h> |
13 #include <sys/types.h> |
| 8 #include <sys/stat.h> |
14 #include <sys/stat.h> |
| 9 #include <string.h> |
15 #include <string.h> |
| 10 #include <ctype.h> |
16 #include <ctype.h> |
| 11 |
17 |
| |
18 /* gaim includes */ |
| |
19 #include "internal.h" |
| |
20 |
| |
21 #include "config.h" |
| |
22 #include "gaim.h" |
| |
23 #include "debug.h" |
| |
24 #include "account.h" |
| |
25 #include "conversation.h" |
| |
26 |
| |
27 |
| |
28 |
| 12 #define FILECTL_PLUGIN_ID "core-filectl" |
29 #define FILECTL_PLUGIN_ID "core-filectl" |
| 13 static int check; |
30 static int check; |
| 14 static time_t mtime; |
31 static time_t mtime; |
| 15 |
32 |
| 16 static void init_file(); |
33 static void init_file(); |
| 17 static void check_file(); |
34 static gboolean check_file(); |
| 18 |
35 |
| 19 /* parse char * as if were word array */ |
36 /* parse char * as if were word array */ |
| 20 char *getarg(char *, int, int); |
37 char *getarg(char *, int, int); |
| 21 |
38 |
| 22 /* go through file and run any commands */ |
39 /* go through file and run any commands */ |
| 34 if (buffer[strlen(buffer) - 1] == '\n') |
51 if (buffer[strlen(buffer) - 1] == '\n') |
| 35 buffer[strlen(buffer) - 1] = 0; |
52 buffer[strlen(buffer) - 1] = 0; |
| 36 gaim_debug(GAIM_DEBUG_MISC, "filectl", "read: %s\n", buffer); |
53 gaim_debug(GAIM_DEBUG_MISC, "filectl", "read: %s\n", buffer); |
| 37 command = getarg(buffer, 0, 0); |
54 command = getarg(buffer, 0, 0); |
| 38 if (!strncasecmp(command, "signon", 6)) { |
55 if (!strncasecmp(command, "signon", 6)) { |
| 39 struct gaim_account *account = NULL; |
56 GaimAccount *account = NULL; |
| 40 GSList *accts = gaim_accounts; |
57 GList *accts = gaim_accounts_get_all(); |
| 41 arg1 = getarg(buffer, 1, 1); |
58 arg1 = getarg(buffer, 1, 1); |
| 42 if (arg1) { |
59 if (arg1) { |
| 43 while (accts) { |
60 while (accts) { |
| 44 struct gaim_account *a = accts->data; |
61 GaimAccount *a = accts->data; |
| 45 if (!strcmp(a->username, arg1)) { |
62 if (!strcmp(a->username, arg1)) { |
| 46 account = a; |
63 account = a; |
| 47 break; |
64 break; |
| 48 } |
65 } |
| 49 accts = accts->next; |
66 accts = accts->next; |
| 51 free(arg1); |
68 free(arg1); |
| 52 } |
69 } |
| 53 if (account) /* username found */ |
70 if (account) /* username found */ |
| 54 gaim_account_connect(account); |
71 gaim_account_connect(account); |
| 55 } else if (!strncasecmp(command, "signoff", 7)) { |
72 } else if (!strncasecmp(command, "signoff", 7)) { |
| 56 struct gaim_connection *gc = NULL; |
73 GaimConnection *gc = NULL; |
| 57 GSList *c = connections; |
74 GList *c = gaim_connections_get_all(); |
| 58 arg1 = getarg(buffer, 1, 1); |
75 arg1 = getarg(buffer, 1, 1); |
| 59 while (arg1 && c) { |
76 while (arg1 && c) { |
| 60 gc = c->data; |
77 gc = c->data; |
| 61 if (!strcmp(gc->username, arg1)) { |
78 if (!strcmp(gc->account->username, arg1)) { |
| 62 break; |
79 break; |
| 63 } |
80 } |
| 64 gc = NULL; |
81 gc = NULL; |
| 65 c = c->next; |
82 c = c->next; |
| 66 } |
83 } |
| 67 if (gc) |
84 if (gc) |
| 68 signoff(gc); |
85 gaim_connection_disconnect(gc); |
| 69 else if (!arg1) |
86 else if (!arg1) |
| 70 signoff_all(NULL, NULL); |
87 gaim_connections_disconnect_all(); |
| 71 free(arg1); |
88 free(arg1); |
| 72 } else if (!strncasecmp(command, "send", 4)) { |
89 } else if (!strncasecmp(command, "send", 4)) { |
| 73 GaimConversation *c; |
90 GaimConversation *c; |
| 74 arg1 = getarg(buffer, 1, 0); |
91 arg1 = getarg(buffer, 1, 0); |
| 75 arg2 = getarg(buffer, 2, 1); |
92 arg2 = getarg(buffer, 2, 1); |
| 76 c = find_conversation(arg1); |
93 c = gaim_find_conversation(arg1); |
| 77 if (!c) c = gaim_conversation_new(GAIM_CONV_IM, arg1); |
94 if (c) |
| 78 write_to_conv(c, arg2, WFLAG_SEND, NULL, time(NULL), -1); |
95 { |
| 79 serv_send_im(c->gc, arg1, arg2, 0); |
96 /* disable for now |
| |
97 gaim_conversation_write(c, arg2, WFLAG_SEND, NULL, time(NULL), -1); |
| |
98 serv_send_im(c->gc, arg1, arg2, 0); |
| |
99 */ |
| |
100 } |
| 80 free(arg1); |
101 free(arg1); |
| 81 free(arg2); |
102 free(arg2); |
| 82 } else if (!strncasecmp(command, "away", 4)) { |
103 } else if (!strncasecmp(command, "away", 4)) { |
| 83 struct away_message a; |
|
| 84 arg1 = getarg(buffer, 1, 1); |
104 arg1 = getarg(buffer, 1, 1); |
| 85 snprintf(a.message, 2048, "%s", arg1); |
105 serv_set_away_all(arg1); |
| 86 a.name[0] = 0; |
|
| 87 do_away_message(NULL, &a); |
|
| 88 free(arg1); |
106 free(arg1); |
| 89 } else if (!strncasecmp(command, "hide", 4)) { |
107 } else if (!strncasecmp(command, "hide", 4)) { |
| 90 hide_buddy_list(); |
108 //hide_buddy_list(); |
| 91 } else if (!strncasecmp(command, "unhide", 6)) { |
109 } else if (!strncasecmp(command, "unhide", 6)) { |
| 92 unhide_buddy_list(); |
110 //unhide_buddy_list(); |
| 93 } else if (!strncasecmp(command, "back", 4)) { |
111 } else if (!strncasecmp(command, "back", 4)) { |
| 94 do_im_back(); |
112 //do_im_back(); |
| 95 } else if (!strncasecmp(command, "quit", 4)) { |
113 } else if (!strncasecmp(command, "quit", 4)) { |
| 96 gaim_core_quit(); |
114 //gaim_core_quit(); |
| 97 } |
115 } |
| 98 free(command); |
116 free(command); |
| 99 } |
117 } |
| 100 |
118 |
| 101 fclose(file); |
119 fclose(file); |
| 116 if ((stat (file, &finfo) == 0) && (finfo.st_size > 0)) |
134 if ((stat (file, &finfo) == 0) && (finfo.st_size > 0)) |
| 117 run_commands(); |
135 run_commands(); |
| 118 } |
136 } |
| 119 |
137 |
| 120 /* check to see if we need to run commands from the file */ |
138 /* check to see if we need to run commands from the file */ |
| 121 void check_file() { |
139 gboolean check_file() { |
| 122 /* most of this was taken from Bash v2.04 by the FSF */ |
140 /* most of this was taken from Bash v2.04 by the FSF */ |
| 123 struct stat finfo; |
141 struct stat finfo; |
| 124 char file[256]; |
142 char file[256]; |
| 125 |
143 |
| 126 sprintf(file, "%s/.gaim/control", getenv("HOME")); |
144 sprintf(file, "%s/.gaim/control", getenv("HOME")); |
| 127 |
145 |
| 128 if ((stat (file, &finfo) == 0) && (finfo.st_size > 0)) |
146 if ((stat (file, &finfo) == 0) && (finfo.st_size > 0)) |
| |
147 { |
| 129 if (mtime != finfo.st_mtime) { |
148 if (mtime != finfo.st_mtime) { |
| 130 gaim_debug(GAIM_DEBUG_INFO, "filectl", |
149 gaim_debug(GAIM_DEBUG_INFO, "filectl", |
| 131 "control changed, checking\n"); |
150 "control changed, checking\n"); |
| 132 run_commands(); |
151 run_commands(); |
| 133 } |
152 } |
| |
153 } |
| |
154 |
| |
155 return TRUE; |
| 134 } |
156 } |
| 135 |
157 |
| 136 char *getarg(char *line, int which, int remain) { |
158 char *getarg(char *line, int which, int remain) { |
| 137 char *arr; |
159 char *arr; |
| 138 char *val; |
160 char *val; |