Mercurial > pidgin
diff src/server.c @ 1:2846a03bda67
[gaim-migrate @ 10]
The other missing files :)
committer: Tailor Script <tailor@pidgin.im>
author | Rob Flynn <gaim@robflynn.com> |
---|---|
date | Thu, 23 Mar 2000 03:13:54 +0000 |
parents | |
children | d5119dc66284 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/server.c Thu Mar 23 03:13:54 2000 +0000 @@ -0,0 +1,764 @@ +/* + * gaim + * + * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <time.h> +#include <stdio.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <unistd.h> +#include <gtk/gtk.h> +#ifdef USE_OSCAR +#include "../libfaim/aim.h" +#endif +#include "gaim.h" + +static int idle_timer = -1; +static time_t lastsent = 0; +static time_t login_time = 0; +static struct timeval lag_tv; +static int is_idle = 0; + +int correction_time = 0; + +int serv_login(char *username, char *password) +{ +#ifndef USE_OSCAR + return toc_login(username, password); +#else + return oscar_login(username, password); +#endif +} + +void serv_close() +{ +#ifndef USE_OSCAR + toc_close(); +#else + oscar_close(); +#endif + gtk_timeout_remove(idle_timer); + idle_timer = -1; +} + + +void serv_touch_idle() +{ + /* Are we idle? If so, not anymore */ + if (is_idle > 0) { + is_idle = 0; + serv_set_idle(0); + } + time(&lastsent); +} + + +static gint check_idle() +{ + time_t t; + + /* Not idle, really... :) */ + update_all_buddies(); + + time(&t); + + gettimeofday(&lag_tv, NULL); + serv_send_im(current_user->username, LAGOMETER_STR, 1); + + if (report_idle != IDLE_GAIM) + return TRUE; + + + if (is_idle) + return TRUE; + + if ((t - lastsent) > 600) { /* 15 minutes! */ + serv_set_idle((int)t - lastsent); + is_idle = 1; + } + + + return TRUE; + +} + + +void serv_finish_login() +{ + char *buf; + + if (strlen(current_user->user_info)) { + buf = g_malloc(strlen(current_user->user_info) * 2); + strcpy(buf, current_user->user_info); + escape_text(buf); + serv_set_info(buf); + g_free(buf); + } + + if (idle_timer != -1) + gtk_timeout_remove(idle_timer); + + idle_timer = gtk_timeout_add(20000, (GtkFunction)check_idle, NULL); + serv_touch_idle(); + + time(&login_time); + + serv_add_buddy(current_user->username); + + if (!(general_options & OPT_GEN_REGISTERED)) + { + show_register_dialog(); + save_prefs(); + } +} + + + +void serv_send_im(char *name, char *message, int away) +{ + char buf[MSG_LEN - 7]; +#ifndef USE_OSCAR + g_snprintf(buf, MSG_LEN - 8, "toc_send_im %s \"%s\"%s", normalize(name), + message, ((away) ? " auto" : "")); + sflap_send(buf, strlen(buf), TYPE_DATA); +#else + aim_send_im(NULL, normalize(name), ((away) ? AIM_IMFLAGS_AWAY : 0), message); +#endif + if (!away) + serv_touch_idle(); +} + +void serv_get_info(char *name) +{ +#ifndef USE_OSCAR + char buf[MSG_LEN]; + g_snprintf(buf, MSG_LEN, "toc_get_info %s", normalize(name)); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + +void serv_get_dir(char *name) +{ +#ifndef USE_OSCAR + char buf[MSG_LEN]; + g_snprintf(buf, MSG_LEN, "toc_get_dir %s", normalize(name)); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + +void serv_set_dir(char *first, char *middle, char *last, char *maiden, + char *city, char *state, char *country, int web) +{ +#ifndef USE_OSCAR + char buf2[BUF_LEN], buf[BUF_LEN]; + g_snprintf(buf2, sizeof(buf2), "%s:%s:%s:%s:%s:%s:%s:%s", first, + middle, last, maiden, city, state, country, + (web == 1) ? "Y" : ""); + escape_text(buf2); + g_snprintf(buf, sizeof(buf), "toc_set_dir %s", buf2); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + +void serv_dir_search(char *first, char *middle, char *last, char *maiden, + char *city, char *state, char *country, char *email) +{ +#ifndef USE_OSCAR + char buf[BUF_LONG]; + g_snprintf(buf, sizeof(buf)/2, "toc_dir_search %s:%s:%s:%s:%s:%s:%s:%s", first, middle, last, maiden, city, state, country, email); + sprintf(debug_buff,"Searching for: %s,%s,%s,%s,%s,%s,%s\n", first, middle, last, maiden, city, state, country); + debug_print(debug_buff); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + + +void serv_set_away(char *message) +{ +#ifndef USE_OSCAR + char buf[MSG_LEN]; + if (message) + g_snprintf(buf, MSG_LEN, "toc_set_away \"%s\"", message); + else + g_snprintf(buf, MSG_LEN, "toc_set_away"); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + +void serv_set_info(char *info) +{ + char buf[MSG_LEN]; +#ifndef USE_OSCAR + g_snprintf(buf, sizeof(buf), "toc_set_info \"%s\n\"", info); + sflap_send(buf, -1, TYPE_DATA); +#else + g_snprintf(buf, sizeof(buf), "%s\n", info); + aim_bos_setprofile(gaim_conn, buf); +#endif +} + +void serv_add_buddy(char *name) +{ +#ifndef USE_OSCAR + char buf[1024]; + g_snprintf(buf, sizeof(buf), "toc_add_buddy %s", normalize(name)); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + +void serv_add_buddies(GList *buddies) +{ + char buf[MSG_LEN]; + int n, num = 0; +#ifndef USE_OSCAR + + n = g_snprintf(buf, sizeof(buf), "toc_add_buddy"); + while(buddies) { + if (num == 20) { + sflap_send(buf, -1, TYPE_DATA); + n = g_snprintf(buf, sizeof(buf), "toc_add_buddy"); + num = 0; + } + ++num; + n += g_snprintf(buf + n, sizeof(buf) - n, " %s", normalize(buddies->data)); + buddies = buddies->next; + } + sflap_send(buf, -1, TYPE_DATA); +#else + while(buddies) { + if (num == 20) { + aim_bos_setbuddylist(gaim_conn, buf); + num = 0; + } + ++num; + n += g_snprintf(buf + n, sizeof(buf) - n, "%s&", normalize(buddies->data)); + buddies = buddies->next; + } + aim_bos_setbuddylist(gaim_conn, buf); +#endif +} + + +void serv_remove_buddy(char *name) +{ +#ifndef USE_OSCAR + char buf[1024]; + g_snprintf(buf, sizeof(buf), "toc_remove_buddy %s", normalize(name)); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + +void serv_add_permit(char *name) +{ +#ifndef USE_OSCAR + char buf[1024]; + g_snprintf(buf, sizeof(buf), "toc_add_permit %s", normalize(name)); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + + + +void serv_add_deny(char *name) +{ +#ifndef USE_OSCAR + char buf[1024]; + g_snprintf(buf, sizeof(buf), "toc_add_deny %s", normalize(name)); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + + + +void serv_set_permit_deny() +{ +#ifndef USE_OSCAR + char buf[MSG_LEN]; + int at; + GList *list; + /* FIXME! We flash here. */ + if (permdeny == 1 || permdeny == 3) { + g_snprintf(buf, sizeof(buf), "toc_add_permit"); + sflap_send(buf, -1, TYPE_DATA); + } else { + g_snprintf(buf, sizeof(buf), "toc_add_deny"); + sflap_send(buf, -1, TYPE_DATA); + } + + + at = g_snprintf(buf, sizeof(buf), "toc_add_permit"); + list = permit; + while(list) { + at += g_snprintf(&buf[at], sizeof(buf) - at, " %s", normalize(list->data)); + list = list->next; + } + buf[at] = 0; + sflap_send(buf, -1, TYPE_DATA); + + at = g_snprintf(buf, sizeof(buf), "toc_add_deny"); + list = deny; + while(list) { + at += g_snprintf(&buf[at], sizeof(buf) - at, " %s", normalize(list->data)); + list = list->next; + } + buf[at] = 0; + sflap_send(buf, -1, TYPE_DATA); + + + +#endif +} + +void serv_set_idle(int time) +{ +#ifndef USE_OSCAR + char buf[256]; + g_snprintf(buf, sizeof(buf), "toc_set_idle %d", time); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + + +void serv_warn(char *name, int anon) +{ +#ifndef USE_OSCAR + char *send = g_malloc(256); + g_snprintf(send, 255, "toc_evil %s %s", name, + ((anon) ? "anon" : "norm")); + sflap_send(send, -1, TYPE_DATA); + g_free(send); +#endif +} + + +void serv_save_config() +{ +#ifndef USE_OSCAR + char *buf = g_malloc(BUF_LONG); + char *buf2 = g_malloc(MSG_LEN); + toc_build_config(buf, BUF_LONG / 2); + g_snprintf(buf2, MSG_LEN, "toc_set_config {%s}", buf); + sflap_send(buf2, -1, TYPE_DATA); + g_free(buf2); + g_free(buf); +#else + FILE *f; + char *buf = g_malloc(BUF_LONG); + char file[1024]; + + g_snprintf(file, sizeof(file), "%s/.gaimbuddy", getenv("HOME")); + + if ((f = fopen(file,"w"))) { + build_config(buf, BUF_LONG - 1); + fprintf(f, "%s\n", buf); + fclose(f); + chmod(buf, S_IRUSR | S_IWUSR); + } else { + g_snprintf(buf, BUF_LONG / 2, "Error writing file %s", file); + do_error_dialog(buf, "Error"); + } + + g_free(buf); + +#endif + +} + + +void serv_accept_chat(int i) +{ +#ifndef USE_OSCAR + char *buf = g_malloc(256); + g_snprintf(buf, 255, "toc_chat_accept %d", i); + sflap_send(buf, -1, TYPE_DATA); + g_free(buf); +#endif +} + +void serv_join_chat(int exchange, char *name) +{ +#ifndef USE_OSCAR + char buf[BUF_LONG]; + g_snprintf(buf, sizeof(buf)/2, "toc_chat_join %d \"%s\"", exchange, name); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + +void serv_chat_invite(int id, char *message, char *name) +{ +#ifndef USE_OSCAR + char buf[BUF_LONG]; + g_snprintf(buf, sizeof(buf)/2, "toc_chat_invite %d \"%s\" %s", id, message, normalize(name)); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + +void serv_chat_leave(int id) +{ +#ifndef USE_OSCAR + char *buf = g_malloc(256); + g_snprintf(buf, 255, "toc_chat_leave %d", id); + sflap_send(buf, -1, TYPE_DATA); + g_free(buf); +#endif +} + +void serv_chat_whisper(int id, char *who, char *message) +{ +#ifndef USE_OSCAR + char buf2[MSG_LEN]; + g_snprintf(buf2, sizeof(buf2), "toc_chat_whisper %d %s \"%s\"", id, who, message); + sflap_send(buf2, -1, TYPE_DATA); +#endif +} + +void serv_chat_send(int id, char *message) +{ +#ifndef USE_OSCAR + char buf[MSG_LEN]; + g_snprintf(buf, sizeof(buf), "toc_chat_send %d \"%s\"",id, message); + sflap_send(buf, -1, TYPE_DATA); +#endif +} + + + + +void serv_got_im(char *name, char *message, int away) +{ + struct conversation *cnv; + int is_idle = -1; + int new_conv = 0; + char *nname; + + nname = g_strdup(normalize(name)); + + if (!strcasecmp(normalize(name), nname)) { + if (!strcmp(message, LAGOMETER_STR)) { + struct timeval tv; + int ms; + + gettimeofday(&tv, NULL); + + ms = 1000000 * (tv.tv_sec - lag_tv.tv_sec); + + ms += tv.tv_usec - lag_tv.tv_usec; + + update_lagometer(ms); + g_free(nname); + return; + } + + } + g_free(nname); + + cnv = find_conversation(name); + + if (awaymessage != NULL) { + if (!(general_options & OPT_GEN_DISCARD_WHEN_AWAY)) { + if (cnv == NULL) { + new_conv = 1; + cnv = new_conversation(name); + } + } + if (cnv != NULL) { + if (sound_options & OPT_SOUND_WHEN_AWAY) + play_sound(AWAY); + write_to_conv(cnv, message, WFLAG_AUTO | WFLAG_RECV); + } + + } else { + if (cnv == NULL) { + new_conv = 1; + cnv = new_conversation(name); + } + if (new_conv && (sound_options & OPT_SOUND_FIRST_RCV)) { + play_sound(FIRST_RECEIVE); + } else { + if (cnv->makesound && (sound_options & OPT_SOUND_RECV)) + play_sound(RECEIVE); + } + write_to_conv(cnv, message, WFLAG_RECV); + } + + + + + if (awaymessage != NULL) { + time_t t; + + time(&t); + + + if ((cnv == NULL) || (t - cnv->sent_away) < 120) + return; + + cnv->sent_away = t; + + if (is_idle) + is_idle = -1; + + serv_send_im(name, awaymessage->message, 1); + + if (is_idle == -1) + is_idle = 1; + + if (cnv != NULL) + write_to_conv(cnv, awaymessage->message, WFLAG_SEND | WFLAG_AUTO); + } +} + + + +void serv_got_update(char *name, int loggedin, int evil, time_t signon, time_t idle, int type) +{ + struct buddy *b; + char *nname; + + b = find_buddy(name); + + nname = g_strdup(normalize(name)); + if (!strcasecmp(nname, normalize(current_user->username))) { + correction_time = (int)(signon - login_time); + update_all_buddies(); + if (!b) + return; + } + + + if (!b) { + sprintf(debug_buff,"Error, no such person\n"); + debug_print(debug_buff); + return; + } + + /* This code will 'align' the name from the TOC */ + /* server with what's in our record. We want to */ + /* store things how THEY want it... */ + if (strcmp(name, b->name)) { + GList *cnv = conversations; + struct conversation *cv; + + char *who = g_malloc(80); + + strcpy(who, normalize(name)); + + while(cnv) { + cv = (struct conversation *)cnv->data; + if (!strcasecmp(who, normalize(cv->name))) { + g_snprintf(cv->name, sizeof(cv->name), "%s", name); + if (find_log_info(name) || (general_options & OPT_GEN_LOG_ALL)) + g_snprintf(who, 63, LOG_CONVERSATION_TITLE, name); + else + g_snprintf(who, 63, CONVERSATION_TITLE, name); + gtk_window_set_title(GTK_WINDOW(cv->window), who); + /* no free 'who', set_title needs it. + */ + break; + } + cnv = cnv->next; + } + g_snprintf(b->name, sizeof(b->name), "%s", name); + /*gtk_label_set_text(GTK_LABEL(b->label), b->name);*/ + + /* okay lets save the new config... */ + + } + + b->idle = idle; + b->evil = evil; + b->uc = type; + + b->signon = signon; + + if (loggedin) { + if (!b->present) { + b->present = 1; + do_pounce(b->name); + } + } else + b->present = 0; + + set_buddy(b); +} + +static +void close_warned(GtkWidget *w, GtkWidget *w2) +{ + gtk_widget_destroy(w2); +} + + + +void serv_got_eviled(char *name, int lev) +{ + char *buf2 = g_malloc(1024); + GtkWidget *d, *label, *close; + + + g_snprintf(buf2, 1023, "You have just been warned by %s.\nYour new warning level is %d./%%", + ((name == NULL) ? "an anonymous person" : name) , lev); + + + d = gtk_dialog_new(); + gtk_widget_realize(d); + aol_icon(d->window); + + label = gtk_label_new(buf2); + gtk_widget_show(label); + close = gtk_button_new_with_label("Close"); + gtk_widget_show(close); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(d)->vbox), + label, FALSE, FALSE, 5); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(d)->action_area), + close, FALSE, FALSE, 5); + + gtk_window_set_title(GTK_WINDOW(d), "Warned"); + gtk_signal_connect(GTK_OBJECT(close), "clicked", GTK_SIGNAL_FUNC(close_warned), d); + gtk_widget_show(d); +} + + + +static void close_invite(GtkWidget *w, GtkWidget *w2) +{ + gtk_widget_destroy(w2); +} + +static void chat_invite_callback(GtkWidget *w, GtkWidget *w2) +{ + int i = (int)gtk_object_get_user_data(GTK_OBJECT(w2)); + serv_accept_chat(i); + gtk_widget_destroy(w2); +} + + + +void serv_got_chat_invite(char *name, int id, char *who, char *message) +{ + GtkWidget *d; + GtkWidget *label; + GtkWidget *yesbtn; + GtkWidget *nobtn; + + char buf2[BUF_LONG]; + + + g_snprintf(buf2, sizeof(buf2), "User '%s' invites you to buddy chat room: '%s'\n%s", who, name, message); + + d = gtk_dialog_new(); + gtk_widget_realize(d); + aol_icon(d->window); + + + label = gtk_label_new(buf2); + gtk_widget_show(label); + yesbtn = gtk_button_new_with_label("Yes"); + gtk_widget_show(yesbtn); + nobtn = gtk_button_new_with_label("No"); + gtk_widget_show(nobtn); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(d)->vbox), + label, FALSE, FALSE, 5); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(d)->action_area), + yesbtn, FALSE, FALSE, 5); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(d)->action_area), + nobtn, FALSE, FALSE, 5); + + + /* gtk_widget_set_usize(d, 200, 110); */ + gtk_object_set_user_data(GTK_OBJECT(d), (void *)id); + + + gtk_window_set_title(GTK_WINDOW(d), "Buddy chat invite"); + gtk_signal_connect(GTK_OBJECT(nobtn), "clicked", GTK_SIGNAL_FUNC(close_invite), d); + gtk_signal_connect(GTK_OBJECT(yesbtn), "clicked", GTK_SIGNAL_FUNC(chat_invite_callback), d); + + + gtk_widget_show(d); +} + +void serv_got_joined_chat(int id, char *name) +{ + struct buddy_chat *b; + + b = (struct buddy_chat *)g_new0(struct buddy_chat, 1); + buddy_chats = g_list_append(buddy_chats, b); + + b->ignored = NULL; + b->in_room = NULL; + b->id = id; + g_snprintf(b->name, 80, "%s", name); + show_new_buddy_chat(b); +} + +void serv_got_chat_left(int id) +{ + GList *bcs = buddy_chats; + struct buddy_chat *b = NULL; + + + while(bcs) { + b = (struct buddy_chat *)bcs->data; + if (id == b->id) { + break; + } + b = NULL; + bcs = bcs->next; + } + + if (!b) + return; + + if (b->window) + gtk_widget_destroy(GTK_WIDGET(b->window)); + + buddy_chats = g_list_remove(buddy_chats, b); + + g_free(b); +} + +void serv_got_chat_in(int id, char *who, int whisper, char *message) +{ + int w; + GList *bcs = buddy_chats; + struct buddy_chat *b = NULL; + + while(bcs) { + b = (struct buddy_chat *)bcs->data; + if (id == b->id) + break; + bcs = bcs->next; + b = NULL; + + } + if (!b) + return; + + if (whisper) + w = WFLAG_WHISPER; + else + w = 0; + + chat_write(b, who, w, message); +} + +