1 #include <time.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <sys/time.h>
7 #include <unistd.h>
8 #include "toc.h"
9 
10 static time_t lastsent = 0;
11 time_t login_time = 0;
12 int my_evil;
13 int is_idle = 0;
14 int lag_ms = 0;
15 int time_to_idle = 600;
16 int is_away = 0;
17 static struct timeval lag_tv;
18 
serv_add_buddy(char * name)19 void serv_add_buddy(char *name)
20 {
21 	char buf[1024];
22 	snprintf(buf, sizeof(buf), "toc_add_buddy %s", normalize(name));
23 	sflap_send(buf, -1, TYPE_DATA);
24 }
25 
serv_remove_buddy(char * name)26 void serv_remove_buddy(char *name)
27 {
28 	char buf[1024];
29 	snprintf(buf, sizeof(buf), "toc_remove_buddy %s", normalize(name));
30 	sflap_send(buf, -1, TYPE_DATA);
31 }
32 
serv_got_im(char * name,char * message,int away)33 int serv_got_im(char *name, char *message, int away)
34 {
35 	/*
36 	struct conversation *cnv;
37 	int is_idle = -1;
38 	*/
39 	char *nname;
40 
41 	nname = strdup(normalize(name));
42 
43 	if (!strcasecmp(normalize(name), nname)) {
44 		if (!strcmp(message, LAGOMETER_STR)) {
45 			struct timeval tv;
46                         int ms;
47 
48 			gettimeofday(&tv, NULL);
49 
50 			ms = 1000000 * (tv.tv_sec - lag_tv.tv_sec);
51 
52 			ms += tv.tv_usec - lag_tv.tv_usec;
53 
54 			lag_ms = ms;
55 			use_handler(TOC_HANDLE,TOC_LAG_UPDATE,NULL);
56 
57                         return -1;
58 		}
59 
60 	}
61 
62 	/*
63         cnv = find_conversation(name);
64 
65         if (cnv == NULL)
66                 cnv = new_conversation(name);
67 
68         if (away)
69                 write_to_conv(cnv, message, WFLAG_AUTO | WFLAG_RECV);
70         else
71                 write_to_conv(cnv, message, WFLAG_RECV);
72 
73 
74         if (cnv->makesound && extrasounds)
75                 play_sound(RECEIVE);
76 
77 
78         if (awaymessage != NULL) {
79                 time_t t;
80 
81                 time(&t);
82 
83 
84                 if ((cnv == NULL) || (t - cnv->sent_away) < 120)
85                         return;
86 
87                 cnv->sent_away = t;
88 
89                 if (is_idle)
90                         is_idle = -1;
91 
92 
93                 serv_send_im(name, awaymessage->message, 1);
94 
95                 if (is_idle == -1)
96                         is_idle = 1;
97 
98                 write_to_conv(cnv, awaymessage->message, WFLAG_SEND | WFLAG_AUTO);
99         }
100 	*/
101 	toc_debug_printf("Received im from %s : %s\n",name,message);
102 	return 1;
103 }
104 
serv_finish_login()105 void serv_finish_login()
106 {
107         char *buf;
108 
109         buf = strdup(user_info);
110         escape_text(buf);
111         serv_set_info(buf);
112 	free(buf);
113 
114 	use_handler(TOC_HANDLE,TOC_REINSTALL_TIMER,NULL);
115 
116         time(&login_time);
117 	serv_touch_idle();
118 
119         serv_add_buddy(aim_username);
120 
121 	if (!registered)
122 	{
123 		/* show_register_dialog(); */
124 		save_prefs();
125 	}
126 }
127 
serv_add_buddies(LL buddies)128 void serv_add_buddies(LL buddies)
129 {
130 	char buf[MSG_LEN];
131 	LLE e;
132         int n, num = 0;
133 
134         n = snprintf(buf, sizeof(buf), "toc_add_buddy");
135         for ( TLL(buddies,e) ) {
136                 if (num == 20) {
137                         sflap_send(buf, -1, TYPE_DATA);
138                         n = snprintf(buf, sizeof(buf), "toc_add_buddy");
139                         num = 0;
140                 }
141                 ++num;
142                 n += snprintf(buf + n, sizeof(buf) - n, " %s", normalize((char *)e->key));
143         }
144 	sflap_send(buf, -1, TYPE_DATA);
145 }
146 
147 
148 
149 
serv_got_update(char * name,int loggedin,int evil,time_t signon,time_t idle,int type)150 void serv_got_update(char *name, int loggedin, int evil, time_t signon, time_t idle, int type)
151 {
152         struct buddy *b;
153         char *nname,**args;
154 
155         b = find_buddy(name);
156 
157         nname = strdup(normalize(name));
158         if (!strcasecmp(nname, normalize(aim_username))) {
159 		/*
160                 correction_time = (int)(signon - login_time);
161                 update_all_buddies();
162 		*/
163 		my_evil = evil;
164                 if (!b)
165                         return;
166         }
167 
168 
169         if (!b) {
170                 toc_debug_printf("Error, no such person\n");
171                 return;
172         }
173 
174         /* This code will 'align' the name from the TOC */
175         /* server with what's in our record.  We want to */
176         /* store things how THEY want it... */
177 	/*
178         if (strcmp(name, b->name)) {
179                 GList  *cnv = conversations;
180                 struct conversation *cv;
181 
182                 char *who = g_malloc(80);
183 
184                 strcpy(who, normalize(name));
185 
186                 while(cnv) {
187                         cv = (struct conversation *)cnv->data;
188                         if (!strcasecmp(who, normalize(cv->name))) {
189                                 g_snprintf(cv->name, sizeof(cv->name), "%s", name);
190                                 if (find_log_info(name) || log_all_conv)
191                                         g_snprintf(who, 63, LOG_CONVERSATION_TITLE, name);
192                                 else
193                                         g_snprintf(who, 63, CONVERSATION_TITLE, name);
194                                 gtk_window_set_title(GTK_WINDOW(cv->window), who);
195 				*/
196                                 /* no free 'who', set_title needs it.
197                                  */
198 				 /*
199                                 break;
200                         }
201                         cnv = cnv->next;
202                 }
203 
204                 g_snprintf(b->name, sizeof(b->name), "%s", name); */
205                 /*gtk_label_set_text(GTK_LABEL(b->label), b->name);*/
206 
207                 /* okay lets save the new config... */
208 
209         /* } */
210 
211         b->idle = idle;
212         b->evil = evil;
213         b->uc = type;
214 
215         b->signon = signon;
216 
217         if (loggedin) {
218                 if (!b->present) {
219                         b->present = 1;
220 			args = (char **) malloc(sizeof(char *)*1);
221 			args[0] = strdup(b->name);
222 			use_handler(TOC_HANDLE,TOC_BUDDY_LOGGED_ON,args);
223 			free(args[0]); free(args);
224                         /* do_pounce(b->name); */
225                 }
226         } else {
227 		if ( b->present ) {
228 			args = (char **) malloc(sizeof(char *)*1);
229 			args[0] = strdup(b->name);
230 			use_handler(TOC_HANDLE,TOC_BUDDY_LOGGED_OFF,args);
231 			free(args[0]); free(args);
232 		}
233                 b->present = 0;
234 	}
235 	/*
236         set_buddy(b);
237 	*/
238 }
239 
240 
serv_send_im(char * name,char * message)241 void serv_send_im(char *name, char *message)
242 {
243 	char buf[MSG_LEN - 7];
244         snprintf(buf, MSG_LEN - 8, "toc_send_im %s \"%s\"%s", normalize(name),
245                    message, ((is_away) ? " auto" : ""));
246 	sflap_send(buf, strlen(buf), TYPE_DATA);
247 
248         if (!is_away && strcasecmp(message,LAGOMETER_STR) != 0)
249                 serv_touch_idle();
250 
251 }
252 
serv_close()253 void serv_close()
254 {
255 	toc_close();
256 }
257 
serv_save_config()258 void serv_save_config()
259 {
260 	char *buf = malloc(BUF_LONG);
261 	char *buf2 = malloc(MSG_LEN);
262 	toc_build_config(buf, BUF_LONG / 2);
263 	snprintf(buf2, MSG_LEN, "toc_set_config {%s}", buf);
264         sflap_send(buf2, -1, TYPE_DATA);
265 	free(buf2);
266 	free(buf);
267 }
268 
serv_warn(char * name,int anon)269 void serv_warn(char *name, int anon)
270 {
271 	char *send = malloc(256);
272 	snprintf(send, 255, "toc_evil %s %s", name,
273 		   ((anon) ? "anon" : "norm"));
274 	sflap_send(send, -1, TYPE_DATA);
275 	free(send);
276 }
277 
serv_add_permit(char * name)278 void serv_add_permit(char *name)
279 {
280 	char buf[1024];
281 	snprintf(buf, sizeof(buf), "toc_add_permit %s", normalize(name));
282 	sflap_send(buf, -1, TYPE_DATA);
283 }
284 
285 
286 
serv_add_deny(char * name)287 void serv_add_deny(char *name)
288 {
289 	char buf[1024];
290 	snprintf(buf, sizeof(buf), "toc_add_deny %s", normalize(name));
291 	sflap_send(buf, -1, TYPE_DATA);
292 }
293 
294 
295 
serv_set_permit_deny()296 void serv_set_permit_deny()
297 {
298 	char buf[MSG_LEN];
299 	char type[30];
300 	int at;
301 	LLE t;
302 	LL l;
303         /* FIXME!  We flash here. */
304         if (permdeny == PERMIT_PERMITALL || permdeny == PERMIT_PERMITSOME) {
305 		strcpy(type,"toc_add_permit");
306 		l = permit;
307         } else {
308 		strcpy(type,"toc_add_deny");
309 		l = deny;
310 
311         }
312 	sflap_send(type, -1, TYPE_DATA);
313 
314 	if ( permdeny == PERMIT_DENYALL || permdeny == PERMIT_PERMITALL ) {
315 		if ( permdeny == PERMIT_DENYALL )
316 			strcpy(type,"toc_add_permit");
317 		else
318 			strcpy(type,"toc_add_deny");
319 		sflap_send(type, -1, TYPE_DATA);
320 		return;
321 	}
322 
323 	at = snprintf(buf, sizeof(buf), "%s",type);
324 	for ( TLL(l,t) ) {
325                 at += snprintf(&buf[at], sizeof(buf) - at, " %s", normalize(t->key));
326 	}
327 	buf[at] = 0;
328 	sflap_send(buf, -1, TYPE_DATA);
329 
330 }
331 
serv_got_joined_chat(int id,char * name)332 void serv_got_joined_chat(int id, char *name)
333 {
334         struct buddy_chat *b;
335 
336         b = (struct buddy_chat *) malloc(sizeof(struct buddy_chat));
337         b->ignored = CreateLL();
338         b->in_room = CreateLL();
339         b->id = id;
340 	b->init_chat = 0;
341         snprintf(b->name, 80, "%s", name);
342 
343 	AddToLL(buddy_chats,name,b);
344 }
345 
serv_got_chat_left(int id)346 void serv_got_chat_left(int id)
347 {
348         LLE t;
349         struct buddy_chat *b = NULL;
350 
351         for ( TLL(buddy_chats,t) ) {
352                 b = (struct buddy_chat *)t->data;
353                 if (id == b->id) {
354                         break;
355                         }
356                 b = NULL;
357         }
358 
359         if (!b)
360                 return;
361 
362 	RemoveFromLLByKey(buddy_chats,b->name);
363 
364 	toc_debug_printf("leaking memory in serv_got_chat_left");
365 }
366 
serv_accept_chat(int i)367 void serv_accept_chat(int i)
368 {
369         char *buf = malloc(256);
370         snprintf(buf, 255, "toc_chat_accept %d",  i);
371         sflap_send(buf, -1, TYPE_DATA);
372         free(buf);
373 }
374 
serv_join_chat(int exchange,char * name)375 void serv_join_chat(int exchange, char *name)
376 {
377         char buf[BUF_LONG];
378         snprintf(buf, sizeof(buf)/2, "toc_chat_join %d \"%s\"", exchange, name);
379         sflap_send(buf, -1, TYPE_DATA);
380 }
381 
serv_chat_invite(int id,char * message,char * name)382 void serv_chat_invite(int id, char *message, char *name)
383 {
384         char buf[BUF_LONG];
385         snprintf(buf, sizeof(buf)/2, "toc_chat_invite %d \"%s\" %s", id, message, normalize(name));
386         sflap_send(buf, -1, TYPE_DATA);
387 }
388 
serv_chat_leave(int id)389 void serv_chat_leave(int id)
390 {
391         char *buf = malloc(256);
392         snprintf(buf, 255, "toc_chat_leave %d",  id);
393         sflap_send(buf, -1, TYPE_DATA);
394         free(buf);
395 }
396 
serv_chat_whisper(int id,char * who,char * message)397 void serv_chat_whisper(int id, char *who, char *message)
398 {
399         char buf2[MSG_LEN];
400         snprintf(buf2, sizeof(buf2), "toc_chat_whisper %d %s \"%s\"", id, who, message);
401         sflap_send(buf2, -1, TYPE_DATA);
402 }
403 
serv_chat_send(int id,char * message)404 void serv_chat_send(int id, char *message)
405 {
406         char buf[MSG_LEN];
407         snprintf(buf, sizeof(buf), "toc_chat_send %d \"%s\"",id, message);
408         sflap_send(buf, -1, TYPE_DATA);
409 	serv_touch_idle();
410 }
411 
serv_chat_warn(int id,char * user,int anon)412 void serv_chat_warn(int  id, char *user, int anon) {
413 	char send[256];
414 	snprintf(send, 255, "toc_chat_evil %d %s %s", id, user,  ((anon) ? "anon" : "norm"));
415 	sflap_send(send, -1, TYPE_DATA);
416 }
417 
418 
serv_get_dir(char * name)419 void serv_get_dir(char *name) {
420         char buf[MSG_LEN];
421         snprintf(buf, MSG_LEN, "toc_get_dir %s", normalize(name));
422         sflap_send(buf, -1, TYPE_DATA);
423 }
424 
serv_set_dir(char * first,char * middle,char * last,char * maiden,char * city,char * state,char * country,char * email,int web)425 void serv_set_dir(char *first, char *middle, char *last, char *maiden,
426 		  char *city, char *state, char *country, char *email, int web)
427 {
428 	char buf2[BUF_LEN], buf[BUF_LEN];
429 	/* sending email seems to mess this up? */
430 	snprintf(buf2, sizeof(buf2), "%s:%s:%s:%s:%s:%s:%s:%s", first,
431 		   middle, last, maiden, city, state, country,
432 		   (web == 1) ? "Y" : "");
433 	escape_text(buf2);
434 	snprintf(buf, sizeof(buf), "toc_set_dir %s", buf2);
435 	sflap_send(buf, -1, TYPE_DATA);
436 }
437 
serv_dir_search(char * first,char * middle,char * last,char * maiden,char * city,char * state,char * country,char * email)438 void serv_dir_search(char *first, char *middle, char *last, char *maiden,
439 		     char *city, char *state, char *country, char *email)
440 {
441 	char buf[BUF_LONG];
442 	snprintf(buf, sizeof(buf)/2, "toc_dir_search %s:%s:%s:%s:%s:%s:%s:%s", first, middle, last, maiden, city, state, country, email);
443 	toc_debug_printf("Searching for: %s,%s,%s,%s,%s,%s,%s\n", first, middle, last, maiden, city, state, country);
444 	sflap_send(buf, -1, TYPE_DATA);
445 }
446 
447 
serv_get_info(char * name)448 void serv_get_info(char *name)
449 {
450         char buf[MSG_LEN];
451         snprintf(buf, MSG_LEN, "toc_get_info %s", normalize(name));
452         sflap_send(buf, -1, TYPE_DATA);
453 }
454 
serv_set_info(char * info)455 void serv_set_info(char *info)
456 {
457 	char buf[MSG_LEN];
458 	snprintf(buf, sizeof(buf), "toc_set_info \"%s\n\"", info);
459 	sflap_send(buf, -1, TYPE_DATA);
460 }
461 
serv_touch_idle()462 void serv_touch_idle() {
463 	/* Are we idle?  If so, not anymore */
464 	if (is_idle > 0) {
465 		is_idle = 0;
466                 serv_set_idle(0);
467 		use_handler(TOC_HANDLE,TOC_WENT_IDLE,NULL);
468         }
469         time(&lastsent);
470 }
471 
serv_set_idle(int time)472 void serv_set_idle(int time)
473 {
474 	char buf[256];
475 	snprintf(buf, sizeof(buf), "toc_set_idle %d", time);
476 	sflap_send(buf, -1, TYPE_DATA);
477 }
478 
check_idle()479 int check_idle() {
480 	time_t t;
481 
482 	time(&t);
483 
484 	use_handler(TOC_HANDLE,TOC_REINSTALL_TIMER,NULL);
485         gettimeofday(&lag_tv, NULL);
486 	serv_send_im(aim_username, LAGOMETER_STR);
487 
488 	/*
489 	if (report_idle != IDLE_GAIM)
490                 return TRUE;
491 	*/
492 
493 
494 	if (is_idle || is_away)
495 		return 1;
496 
497 	toc_debug_printf("time_to_idle = %d, current idle = %d, t = %d, last_sent = %d",time_to_idle,(t - lastsent),t,lastsent);
498 	if ((t - lastsent) > time_to_idle) { /* 10 minutes! */
499 		serv_set_idle((int)t - lastsent);
500 		toc_debug_printf("went idle wieth time_to_idle = %d",time_to_idle);
501 		use_handler(TOC_HANDLE,TOC_WENT_IDLE,NULL);
502 		is_idle = 1;
503         }
504 
505 
506 	return 1;
507 
508 }
509 
serv_set_away(char * message)510 void serv_set_away(char *message) {
511         char buf[MSG_LEN];
512         if ( ! is_away && message ) {
513 		is_away = 1;
514                 snprintf(buf, MSG_LEN, "toc_set_away \"%s\"", message);
515         } else {
516 		is_away = 0;
517                 snprintf(buf, MSG_LEN, "toc_set_away");
518 	}
519 	sflap_send(buf, -1, TYPE_DATA);
520 }
521