diff src/perl.c @ 1101:0ef4386edc29

[gaim-migrate @ 1111] wow, perl got updated. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Thu, 16 Nov 2000 10:06:12 +0000
parents f168625b63fe
children 5bc8fdacd2cb
line wrap: on
line diff
--- a/src/perl.c	Thu Nov 16 08:48:01 2000 +0000
+++ b/src/perl.c	Thu Nov 16 10:06:12 2000 +0000
@@ -78,24 +78,23 @@
 static PerlInterpreter *my_perl = NULL;
 
 /* dealing with gaim */
-XS(XS_AIM_register); /* set up hooks for script */
-XS(XS_AIM_get_info); /* version, last to attempt signon, protocol */
-XS(XS_AIM_print); /* lemme figure this one out... */
+XS(XS_GAIM_register); /* set up hooks for script */
+XS(XS_GAIM_get_info); /* version, last to attempt signon, protocol */
+XS(XS_GAIM_print); /* lemme figure this one out... */
 
 /* list stuff */
-XS(XS_AIM_buddy_list); /* all buddies */
-XS(XS_AIM_online_list); /* online buddies */
-XS(XS_AIM_deny_list); /* also returns permit list */
+XS(XS_GAIM_buddy_list); /* all buddies */
+XS(XS_GAIM_online_list); /* online buddies */
 
 /* server stuff */
-XS(XS_AIM_command); /* send command to server */
-XS(XS_AIM_user_info); /* given name, return struct buddy members */
-XS(XS_AIM_print_to_conv); /* send message to someone */
-XS(XS_AIM_print_to_chat); /* send message to chat room */
+XS(XS_GAIM_command); /* send command to server */
+XS(XS_GAIM_user_info); /* given name, return struct buddy members */
+XS(XS_GAIM_print_to_conv); /* send message to someone */
+XS(XS_GAIM_print_to_chat); /* send message to chat room */
 
 /* handler commands */
-XS(XS_AIM_add_event_handler); /* when servers talk */
-XS(XS_AIM_add_timeout_handler); /* figure it out */
+XS(XS_GAIM_add_event_handler); /* when servers talk */
+XS(XS_GAIM_add_timeout_handler); /* figure it out */
 
 void xs_init()
 {
@@ -207,21 +206,20 @@
 	Perl_eval_pv(load_file, TRUE);
 #endif
 
-	newXS ("AIM::register", XS_AIM_register, "AIM");
-	newXS ("AIM::get_info", XS_AIM_get_info, "AIM");
-	newXS ("AIM::print", XS_AIM_print, "AIM");
+	newXS ("GAIM::register", XS_GAIM_register, "GAIM");
+	newXS ("GAIM::get_info", XS_GAIM_get_info, "GAIM");
+	newXS ("GAIM::print", XS_GAIM_print, "GAIM");
 
-	newXS ("AIM::buddy_list", XS_AIM_buddy_list, "AIM");
-	newXS ("AIM::online_list", XS_AIM_online_list, "AIM");
-	newXS ("AIM::deny_list", XS_AIM_deny_list, "AIM");
+	newXS ("GAIM::buddy_list", XS_GAIM_buddy_list, "GAIM");
+	newXS ("GAIM::online_list", XS_GAIM_online_list, "GAIM");
 
-	newXS ("AIM::command", XS_AIM_command, "AIM");
-	newXS ("AIM::user_info", XS_AIM_user_info, "AIM");
-	newXS ("AIM::print_to_conv", XS_AIM_print_to_conv, "AIM");
-	newXS ("AIM::print_to_chat", XS_AIM_print_to_chat, "AIM");
+	newXS ("GAIM::command", XS_GAIM_command, "GAIM");
+	newXS ("GAIM::user_info", XS_GAIM_user_info, "GAIM");
+	newXS ("GAIM::print_to_conv", XS_GAIM_print_to_conv, "GAIM");
+	newXS ("GAIM::print_to_chat", XS_GAIM_print_to_chat, "GAIM");
 
-	newXS ("AIM::add_event_handler", XS_AIM_add_event_handler, "AIM");
-	newXS ("AIM::add_timeout_handler", XS_AIM_add_timeout_handler, "AIM");
+	newXS ("GAIM::add_event_handler", XS_GAIM_add_event_handler, "GAIM");
+	newXS ("GAIM::add_timeout_handler", XS_GAIM_add_timeout_handler, "GAIM");
 }
 
 void perl_end()
@@ -264,7 +262,7 @@
 	}
 }
 
-XS (XS_AIM_register)
+XS (XS_GAIM_register)
 {
 	char *name, *ver, *callback, *unused; /* exactly like X-Chat, eh? :) */
 	int junk;
@@ -287,8 +285,9 @@
 	XSRETURN (1);
 }
 
-XS (XS_AIM_get_info)
+XS (XS_GAIM_get_info)
 {
+	int i = 0;
 	int junk;
 	dXSARGS;
 	items = 0;
@@ -296,30 +295,44 @@
 	switch(atoi(SvPV(ST(0), junk))) {
 	case 0:
 		XST_mPV(0, VERSION);
+		i = 1;
 		break;
 	case 1:
-		/* FIXME: no more current_user
-		XST_mPV(0, current_user->username);
-		*/
+		{
+			GSList *c = connections;
+			struct gaim_connection *gc;
+
+			while (c) {
+				gc = (struct gaim_connection *)c->data;
+				XST_mPV(i++, gc->username);
+				c = c->next;
+			}
+		}
 		break;
 	case 2:
-		/* FIXME: more per-connection issues
-		if (!blist)
-			XST_mPV(0, "Offline");
-		else if (!USE_OSCAR)
-			XST_mPV(0, "TOC");
-		else
-			XST_mPV(0, "Oscar");
-		*/
+		{
+			GList *u = aim_users;
+			struct aim_user *a;
+			char *name = g_strdup(normalize(SvPV(ST(1), junk)));
+
+			while (u) {
+				a = (struct aim_user *)u->data;
+				if (!strcasecmp(normalize(a->username), name))
+					XST_mIV(i++, a->protocol);
+				u = u->next;
+			}
+			g_free(name);
+		}
 		break;
 	default:
 		XST_mPV(0, "Error2");
+		i = 1;
 	}
 
-	XSRETURN(1);
+	XSRETURN(i);
 }
 
-XS (XS_AIM_print)
+XS (XS_GAIM_print)
 {
 	char *title;
 	char *message;
@@ -333,17 +346,23 @@
 	XSRETURN(0);
 }
 
-XS (XS_AIM_buddy_list)
+XS (XS_GAIM_buddy_list)
 {
-	/* FIXME
+	char *acct;
+	struct gaim_connection *gc;
 	struct buddy *buddy;
 	struct group *g;
-	GSList *list = groups;
-	GList *mem;
+	GSList *list = NULL;
+	GSList *mem;
 	int i = 0;
+	int junk;
 	dXSARGS;
 	items = 0;
 
+	acct = SvPV(ST(0), junk);
+	gc = find_gaim_conn_by_name(acct);
+	if (gc) list = gc->groups;
+
 	while (list) {
 		g = (struct group *)list->data;
 		mem = g->members;
@@ -355,20 +374,25 @@
 		list = g_slist_next(list);
 	}
 	XSRETURN(i);
-	*/
 }
 
-XS (XS_AIM_online_list)
+XS (XS_GAIM_online_list)
 {
-	/* FIXME
+	char *acct;
+	struct gaim_connection *gc;
 	struct buddy *b;
 	struct group *g;
-	GSList *list = groups;
-	GList *mem;
+	GSList *list = NULL;
+	GSList *mem;
 	int i = 0;
+	int junk;
 	dXSARGS;
 	items = 0;
 
+	acct = SvPV(ST(0), junk);
+	gc = find_gaim_conn_by_name(acct);
+	if (gc) list = gc->groups;
+
 	while (list) {
 		g = (struct group *)list->data;
 		mem = g->members;
@@ -380,28 +404,9 @@
 		list = g_slist_next(list);
 	}
 	XSRETURN(i);
-	*/
 }
 
-XS (XS_AIM_deny_list)
-{
-	/* FIXME, yet again. perl is so fucked
-	char *name;
-	GList *list = deny;
-	int i = 0;
-	dXSARGS;
-	items = 0;
-
-	while (list) {
-		name = (char *)list->data;
-		XST_mPV(i++, name);
-		list = list->next;
-	}
-	XSRETURN(i);
-	*/
-}
-
-XS (XS_AIM_command)
+XS (XS_GAIM_command)
 {
 	int junk;
 	char *command = NULL;
@@ -411,15 +416,14 @@
 	command = SvPV(ST(0), junk);
 	if (!command) XSRETURN(0);
 	if        (!strncasecmp(command, "signon", 6)) {
-		/* FIXME
-		if (!blist) {
-			show_login();
-			dologin(0, 0);
-		}
-		*/
+		char *who = SvPV(ST(1), junk);
+		struct aim_user *u = find_user(who, -1);
+		if (u) serv_login(u);
 	} else if (!strncasecmp(command, "signoff", 7)) {
-		/* FIXME: we need to figure out how this works for multiple connections
-		 * signoff(); */
+		char *who = SvPV(ST(1), junk);
+		struct gaim_connection *gc = find_gaim_conn_by_name(who);
+		if (gc) signoff(gc);
+		else signoff_all(NULL, NULL);
 	} else if (!strncasecmp(command, "away", 4)) {
 		char *message = SvPV(ST(1), junk);
 		struct away_message a;
@@ -428,22 +432,33 @@
 	} else if (!strncasecmp(command, "back", 4)) {
 		do_im_back();
 	} else if (!strncasecmp(command, "idle", 4)) {
-		/* FIXME
-		serv_set_idle(atoi(SvPV(ST(1), junk)));
-		*/
+		GSList *c = connections;
+		struct gaim_connection *gc;
+
+		while (c) {
+			gc = (struct gaim_connection *)c->data;
+			serv_set_idle(gc, atoi(SvPV(ST(1), junk)));
+			gc->is_idle = 1;
+			c = c->next;
+		}
 	} else if (!strncasecmp(command, "warn", 4)) {
-		/* yet another perl FIXME
-		char *name = SvPV(ST(1), junk);
-		serv_warn(name, 0);
-		*/
+		GSList *c = connections;
+		struct gaim_connection *gc;
+
+		while (c) {
+			gc = (struct gaim_connection *)c->data;
+			serv_warn(gc, SvPV(ST(1), junk), 0);
+			c = c->next;
+		}
 	}
 
 	XSRETURN(0);
 }
 
-XS (XS_AIM_user_info)
+XS (XS_GAIM_user_info)
 {
-	/* FIXME
+	GSList *c = connections;
+	struct gaim_connection *gc;
 	int junk;
 	struct buddy *buddy;
 	char *nick;
@@ -453,23 +468,27 @@
 	nick = SvPV(ST(0), junk);
 	if (!nick[0])
 		XSRETURN(0);
-	buddy = find_buddy(nick);
+	while (c) {
+		gc = (struct gaim_connection *)c->data;
+		buddy = find_buddy(gc, nick);
+		if (buddy) c = NULL;
+		else c = c->next;
+	}
 	if (!buddy)
 		XSRETURN(0);
 	XST_mPV(0, buddy->name);
-	XST_mPV(1, buddy->present ? "Online" : "Offline");
-	XST_mIV(2, buddy->evil);
-	XST_mIV(3, buddy->signon);
-	XST_mIV(4, buddy->idle);
-	XST_mIV(5, buddy->uc);
-	XST_mIV(6, buddy->caps);
-	XSRETURN(7);
-	*/
+	XST_mPV(1, buddy->show);
+	XST_mPV(2, buddy->present ? "Online" : "Offline");
+	XST_mIV(3, buddy->evil);
+	XST_mIV(4, buddy->signon);
+	XST_mIV(5, buddy->idle);
+	XST_mIV(6, buddy->uc);
+	XST_mIV(7, buddy->caps);
+	XSRETURN(8);
 }
 
-XS (XS_AIM_print_to_conv)
+XS (XS_GAIM_print_to_conv)
 {
-	/* FIXME
 	char *nick, *what;
 	struct conversation *c;
 	int junk;
@@ -482,33 +501,37 @@
 	if (!c)
 		c = new_conversation(nick);
 	write_to_conv(c, what, WFLAG_SEND, NULL);
-	serv_send_im(nick, what, 0);
-	*/
+	serv_send_im(c->gc, nick, what, 0);
 }
 
-XS (XS_AIM_print_to_chat)
+XS (XS_GAIM_print_to_chat)
 {
-	/* FIXME: need to make this multi-connection based
-	char *nick, *what;
-	struct conversation *c = NULL;
-	GList *bcs = buddy_chats;
+	char *nick, *what, *tmp;
+	GSList *c = connections;
+	struct gaim_connection *gc;
+	struct conversation *b = NULL;
+	GSList *bcs;
 	int junk;
 	dXSARGS;
 	items = 0;
 
 	nick = SvPV(ST(0), junk);
 	what = SvPV(ST(1), junk);
-	while (bcs) {
-		c = (struct conversation *)bcs->data;
-		if (!strcmp(c->name, nick))
-			break;
-		bcs = bcs->next;
-		c = NULL;
+	tmp = g_strdup(normalize(nick));
+	while (c) {
+		gc = (struct gaim_connection *)c->data;
+		bcs = gc->buddy_chats;
+		while (bcs) {
+			b = (struct conversation *)bcs->data;
+			if (!strcmp(normalize(b->name), tmp))
+				break;
+			bcs = bcs->next;
+			b = NULL;
+		}
+		serv_chat_send(b->gc, b->id, what);
+		c = c->next;
 	}
-	if (!c)
-		XSRETURN(0);
-	serv_chat_send(c->id, what);
-	*/
+	XSRETURN(0);
 }
 
 int perl_event(char *event, char *args)
@@ -529,7 +552,7 @@
 	return 0;
 }
 
-XS (XS_AIM_add_event_handler)
+XS (XS_GAIM_add_event_handler)
 {
 	int junk;
 	struct _perl_event_handlers *handler;
@@ -555,7 +578,7 @@
 	return 0; /* returning zero removes the timeout handler */
 }
 
-XS (XS_AIM_add_timeout_handler)
+XS (XS_GAIM_add_timeout_handler)
 {
 	int junk;
 	long timeout;