Commit 3222e3af authored by Andrew Price's avatar Andrew Price
Browse files

Logon/join/leave/logoff improvements

Don't send separate messages to announce these events, have mw display
them on receipt of onoff events, if scripted handlers allow it to.
parent b58c7806
Loading
Loading
Loading
Loading
Loading
+34 −15
Original line number Diff line number Diff line
@@ -114,6 +114,24 @@ void ClearStack(void) {
	MesgStacked=0;
}

static void display_onoff(int action, const char *name, int room)
{
	switch (action) {
	case ONOFF_LEAVE:
		format_message("\03311* %s has just left the talker.", name);
		break;
	case ONOFF_JOIN:
		format_message("\03310* %s has just joined talker room %d.", name, room);
		break;
	case ONOFF_LOGOFF:
		format_message("\03302* %s has just left the board.", name);
		break;
	case ONOFF_LOGON:
		format_message("\03301* %s has just entered the board.", name);
		break;
	}
}

void DisplayStack(void)
{
	struct mstack	*new;
@@ -203,12 +221,13 @@ void DisplayStack(void)
				};
				char *onoff_name;
				const char *uname, *reason;
				int ccode, isquiet, action, type;
				int ccode, isquiet, action, type, room = 0;
				struct mwevent ev = {
						.ev_type = MWEV_TYPE_ONOFF,
						.ev_data.onoff = new->msg,
				};
				script_output = 1;
				if (cp_test(user, CP_SCRIPT))
					js_handle_event(&ev);

				/* go through list and find checkonoff function */
@@ -227,6 +246,8 @@ void DisplayStack(void)
					reason = json_getstring(j, "reason");
				else
					reason = json_getstring(j, "message");
				if (action == ONOFF_JOIN)
					room = json_getint(j, "channel");

				if (action >= ONOFF_SIZE)
					break;
@@ -286,7 +307,10 @@ void DisplayStack(void)
				a.version[0] = '3';
				if (reason != NULL)
					snprintf(a.reason, MAXTEXTLENGTH - 1, "%s", reason);
				if (cp_test(user, CP_SCRIPT))
					ExecEvent2(onoff_name, "CheckOnOff", new->from, 0, 6, aargs);
				if (script_output && !isquiet)
					display_onoff(action, uname, room);
				break;
			}
			default:
@@ -554,7 +578,6 @@ static void display_content(ipc_message_t *msg)
		}
	} else
	if (msg->head.type == IPC_CHECKONOFF) {
		if (cp_test(user, CP_SCRIPT)) {
		struct mstack *ms;

		ms = calloc(1, sizeof(*ms));
@@ -562,7 +585,6 @@ static void display_content(ipc_message_t *msg)
		ms->preamble = EST_CHECKONOFF;
		ms->from = strdup(whom);
		InsertMesg(ms, msg);
		}
	} else {
		printf("Unknown message type %4.4s", (char *)&msg->head.type);
	}
@@ -980,9 +1002,6 @@ static void zod(const char *from, const char *msg)
	printf(_("%s just sent the Zebedee of Death to you.\n"),from);
	fflush(stdout);

	/* broadcast leaving message if not quiet */
	if (!quietmode) broadcast(4|0x100, "\03311%s has just left the talker", user->record.name);

	/* set 'off talker' permissions for commands */
	set_rights();
	disable_rl(1);
+1 −8
Original line number Diff line number Diff line
@@ -633,17 +633,13 @@ int main(int argc, char **argv)
	if (login_status == 3) /* Autoregistered */
		broadcast(3, "Auto-registered %s", user->record.name);

	quietmode = 0;
	if ((s_quiet(user) || u_god(user)) && qflag)
	{
		extern int talker_logontype;
		quietmode=1;
		talker_logontype |= LOGONMASK_QUIET;
	}else
	{
		broadcast(1, _("\03301%s has just entered the board."),user->record.name);
		quietmode=0;
	}

	{
		struct sockaddr_in sa;
		socklen_t ss;
@@ -907,9 +903,6 @@ void close_down(int logofftype, char *sourceuser, char *reason)
	stop_js();
	alarm_cleanup();

	if (!quietmode && logofftype != LOGOFF_TIMEOUT && logofftype != LOGOFF_EOFS)
		broadcast(1, "\03302%s has just left the board.", user->record.name);

	mwlog(user, "LOGOUT");
	sleep(1); //dodgy hack for race condition in checkonoff, cunningly we currently get woken by the very message we're waiting for.

+3 −17
Original line number Diff line number Diff line
@@ -183,12 +183,8 @@ void t_uptime(CommandList *cm, int argc, const char **argv, char *args)

void t_quit(CommandList *cm, int argc, const char **argv, char *args)
{
	char text[MAXTEXTLENGTH];
	user->record.chatmode = cm_clear(user, CM_ONCHAT);
	update_user(user);
	snprintf(text, MAXTEXTLENGTH-1, "\03311%s has just left the talker", user->record.name);
	if (!quietmode) talk_send_rawbcast(text);

	announce_leave(user->record.name, user->record.room, LEAVE_NORMAL, NULL, NULL, quietmode);
	set_rights();
}
@@ -1106,25 +1102,15 @@ void t_uri(CommandList *cm, int argc, const char **argv, char *args)
void t_chaton(void)
{
	struct person *urec = &user->record;
	char text[MAXTEXTLENGTH];
	char mtext[MAXTEXTLENGTH];

	set_talk_rights();

	/* set mode to 'on talker', and update whofile for autoexec function */
	urec->chatmode = cm_set(user, CM_ONCHAT);
	update_user(user);

	if (user->room.name!=NULL)
		snprintf(mtext, MAXTEXTLENGTH-1, "\03310%s has just joined talker in %s",
		         urec->name, user->room.name);
	else
		snprintf(mtext, MAXTEXTLENGTH-1, "\03310%s has just joined talker room %d",
		         urec->name, urec->room);
	snprintf(text, MAXTEXTLENGTH-1, "\03310%s has just joined talker room %d",
	         urec->name, urec->room);
	if (!quietmode) talk_send_rawbcast(text);
	printf("Now entering the talker. Use \".quit\" to leave and \".help\" for help.\n");
	format_message("\03310* Joining talker room %d. "
	               "Use \".quit\" to leave and \".help\" for help.\n",
	               urec->room);

	/* run the common stuff for entering the talker */
	enter_talker(1);