Esempio n. 1
0
/* PROTO */
void
buddy_unaway(void *c, const char *who)
{
	struct BuddyList *trav;
	char           *sn = simplify_sn(who);

	trav = buddylist;

	while (trav != NULL) {
		if (strcmp(sn, trav->sn) == 0) {
			trav->away = 0;
			break;
		}
		trav = trav->next;
	}

	free(sn);

	if (conn->squelchaway)
		return;

	eraseline();
	b_echostr();

	if (conn->timestamps) {
		putchar(' ');
		addts();
	}
	set_color(COLOR_BUDDY_AWAY);
	printf(" %s ", who);
	set_color(0);
	printf("is no longer away.\n");
	show_prompt();
	return;
}
Esempio n. 2
0
/* PROTO */
void
buddy_idle(void *c, const char *who, long idletime)
{
	struct BuddyList *trav;
	int             changed = 1;
	char           *sn = simplify_sn(who);

	trav = buddylist;

	while (trav != NULL) {
		if (strcmp(trav->sn, sn) == 0) {
			trav->idletime = idletime;

			if (idletime >= 10) {
				if (trav->idle)
					changed = 0;
				trav->idle = 1;
			} else {
				if (trav->idle == 0)
					changed = 0;
				trav->idle = 0;
			}
			break;
		}
		trav = trav->next;
	}

	free(sn);

	/*
         * in case for whatever reason the buddy isn't in the list (shouldn't
         * happen)
         */
	if (trav == NULL) {
		return;
	}
	if (!changed) {
		return;
	}
	if (conn->squelchidle)
		return;

	eraseline();
	b_echostr();

	if (conn->timestamps) {
		putchar(' ');
		addts();
	}
	set_color(COLOR_BUDDY_IDLE);
	printf(" %s ", who);
	set_color(0);

	printf("is %s idle.\n", (trav->idle ? "now" : "no longer"));
	show_prompt();
	return;
}
Esempio n. 3
0
/* PROTO */
void
buddy_offline(void *c, const char *who)
{
	char           *sname;
	int             found = 0;
	struct BuddyList *trav;

	sname = simplify_sn(who);

	trav = buddylist;
	while (trav != NULL) {
		if (strcmp(trav->sn, sname) == 0) {
			found = 1;

			if (trav->otr == 1) {
				otrl_message_disconnect_all_instances(userstate, &ui_ops, NULL,
      	                	conn->username, otr_proto, trav->sn);
             			trav->otr = 0;
                        	trav->otr_context = NULL;
                        	printf("[OTR] Ending OTR session with %s\n", trav->sn);
			}

			if (trav->prev == NULL) {
				buddylist = buddylist->next;
				if (buddylist != NULL)
					buddylist->prev = NULL;
				free(trav->sn);
				free(trav->formattedsn);
				free(trav);
				break;
			} else {
				trav->prev->next = trav->next;
				if (trav->next != NULL)
					trav->next->prev = trav->prev;
				free(trav->sn);
				free(trav->formattedsn);
				free(trav);
				break;
			}
		}
		trav = trav->next;
	}

	if (!found) {
		free(sname);
		return;
	}
	conn->buddiesonline--;

	if (conn->squelchconnect) {
		free(sname);
		return;
	}
	eraseline();
	b_echostr();

	if (conn->timestamps) {
		putchar(' ');
		addts();
	}
	set_color(COLOR_BUDDY_SIGNOFF);
	printf(" %s ", who);
	set_color(0);

	printf("has signed off.\n");
	log_event(EVENT_SIGNOFF, sname, NULL);
	free(sname);
	show_prompt();
}
Esempio n. 4
0
/* PROTO */
void
buddy_online(void *c, const char *who)
{
	struct BuddyList *trav, *newbuddy;
	char           *sname;

	trav = buddylist;

	sname = simplify_sn(who);
	if (buddylist == NULL) {
		buddylist = malloc(sizeof(struct BuddyList));
		newbuddy = buddylist;
		newbuddy->prev = NULL;
		newbuddy->next = NULL;
	} else {
		for (trav = buddylist; trav != NULL; trav = trav->next) {
			if (strcmp(sname, trav->sn) < 0)
				break;
		}

		newbuddy = malloc(sizeof(struct BuddyList));

		if (trav == NULL) {	/* if it's the last entry */
			for (trav = buddylist; trav->next != NULL; trav = trav->next);
			trav->next = newbuddy;
			newbuddy->prev = trav;
			newbuddy->next = NULL;
		} else {
			if (trav == buddylist) {
				buddylist->prev = newbuddy;
				newbuddy->prev = NULL;
				newbuddy->next = buddylist;
				buddylist = newbuddy;
			} else {
				trav->prev->next = newbuddy;
				newbuddy->prev = trav->prev;
				newbuddy->next = trav;
				trav->prev = newbuddy;
			}
		}

	}

	newbuddy->sn = strdup(sname);
	newbuddy->formattedsn = strdup(who);
	newbuddy->away = 0;
	newbuddy->idle = 0;
	newbuddy->otr = 0;
	newbuddy->otr_context = otrl_context_find(userstate, newbuddy->sn,
					conn->username, otr_proto,
					OTRL_INSTAG_BEST, 1, 0,
					NULL, NULL);

	conn->buddiesonline++;

	if (conn->squelchconnect) {
		free(sname);
		return;
	}
	eraseline();
	b_echostr();

	if (conn->timestamps) {
		putchar(' ');
		addts();
	}
	set_color(COLOR_BUDDY_SIGNON);
	printf(" %s ", who);
	set_color(0);
	printf("is now online.\n");
	log_event(EVENT_SIGNON, sname, NULL);
	free(sname);
	show_prompt();
}
Esempio n. 5
0
/* PROTO */
void
buddy_offline(void *c, const char *who)
{
	char           *sname;
	int             found = 0;
	struct BuddyList *trav;

	sname = simplify_sn(who);

	trav = buddylist;
	while (trav != NULL) {
		if (strcmp(trav->sn, sname) == 0) {
			found = 1;

			if (trav->prev == NULL) {
				buddylist = buddylist->next;
				if (buddylist != NULL)
					buddylist->prev = NULL;
				free(trav->sn);
				free(trav->formattedsn);
				free(trav);
				break;
			} else {
				trav->prev->next = trav->next;
				if (trav->next != NULL)
					trav->next->prev = trav->prev;
				free(trav->sn);
				free(trav->formattedsn);
				free(trav);
				break;
			}
		}
		trav = trav->next;
	}

	if (!found) {
		free(sname);
		return;
	}
	conn->buddiesonline--;

	if (conn->squelchconnect) {
		free(sname);
		return;
	}
	eraseline();
	b_echostr();

	if (conn->timestamps) {
		putchar(' ');
		addts();
	}
	set_color(COLOR_BUDDY_SIGNOFF);
	printf(" %s ", who);
	set_color(0);

	printf("has signed off.\n");
	log_event(EVENT_SIGNOFF, sname, NULL);
	free(sname);
	show_prompt();
}