about summary refs log tree commit diff
path: root/input.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2018-08-10 23:31:20 -0400
committerJune McEnroe <june@causal.agency>2018-08-10 23:31:20 -0400
commit07c750d25cf26883507d46bf319e55d2e35d6a94 (patch)
treedcf7dbc50dd717a1190c2f034ff440badf5a525c /input.c
parentMove process spawning onto the event loop (diff)
downloadcatgirl-07c750d25cf26883507d46bf319e55d2e35d6a94.tar.gz
catgirl-07c750d25cf26883507d46bf319e55d2e35d6a94.zip
Become multi-channel
There's a lot of UI missing for it, but it technically works.
Diffstat (limited to '')
-rw-r--r--input.c75
1 files changed, 49 insertions, 26 deletions
diff --git a/input.c b/input.c
index 56c38bf..f4e3106 100644
--- a/input.c
+++ b/input.c
@@ -23,12 +23,13 @@
 
 #include "chat.h"
 
-static void privmsg(bool action, const char *mesg) {
+static void privmsg(struct Tag tag, bool action, const char *mesg) {
+	if (tag.id == TAG_DEFAULT.id) return;
 	char *line;
 	int send;
 	asprintf(
 		&line, ":%s!%s %nPRIVMSG %s :%s%s%s",
-		chat.nick, chat.user, &send, chat.join,
+		self.nick, self.user, &send, tag.name,
 		(action ? "\1ACTION " : ""), mesg, (action ? "\1" : "")
 	);
 	if (!line) err(EX_OSERR, "asprintf");
@@ -37,35 +38,47 @@ static void privmsg(bool action, const char *mesg) {
 	free(line);
 }
 
-typedef void (*Handler)(char *params);
+typedef void (*Handler)(struct Tag tag, char *params);
 
-static void inputMe(char *params) {
-	privmsg(true, params ? params : "");
+static void inputMe(struct Tag tag, char *params) {
+	privmsg(tag, true, params ? params : "");
 }
 
-static void inputNick(char *params) {
+static void inputNick(struct Tag tag, char *params) {
+	(void)tag;
 	char *nick = strsep(&params, " ");
 	if (nick) {
 		ircFmt("NICK %s\r\n", nick);
 	} else {
-		uiLog(L"/nick requires a name");
+		uiLog(TAG_DEFAULT, L"/nick requires a name");
 	}
 }
 
-static void inputWho(char *params) {
-	(void)params;
-	ircFmt("WHO %s\r\n", chat.join);
+static void inputJoin(struct Tag tag, char *params) {
+	(void)tag;
+	char *chan = strsep(&params, " ");
+	if (chan) {
+		ircFmt("JOIN %s\r\n", chan);
+	} else {
+		uiLog(TAG_DEFAULT, L"/join requires a channel");
+	}
 }
 
-static void inputTopic(char *params) {
-	if (params) {
-		ircFmt("TOPIC %s :%s\r\n", chat.join, params);
+static void inputWho(struct Tag tag, char *params) {
+	(void)params; // TODO
+	ircFmt("WHO %s\r\n", tag.name);
+}
+
+static void inputTopic(struct Tag tag, char *params) {
+	if (params) { // TODO
+		ircFmt("TOPIC %s :%s\r\n", tag.name, params);
 	} else {
-		ircFmt("TOPIC %s\r\n", chat.join);
+		ircFmt("TOPIC %s\r\n", tag.name);
 	}
 }
 
-static void inputQuit(char *params) {
+static void inputQuit(struct Tag tag, char *params) {
+	(void)tag;
 	if (params) {
 		ircFmt("QUIT :%s\r\n", params);
 	} else {
@@ -73,25 +86,34 @@ static void inputQuit(char *params) {
 	}
 }
 
-static void inputUrl(char *params) {
+static void inputUrl(struct Tag tag, char *params) {
 	(void)params;
-	urlList();
+	urlList(tag);
 }
-static void inputOpen(char *params) {
-	if (!params) { urlOpen(1); return; }
+static void inputOpen(struct Tag tag, char *params) {
+	if (!params) { urlOpen(tag, 1); return; }
 	size_t from = strtoul(strsep(&params, "-,"), NULL, 0);
-	if (!params) { urlOpen(from); return; }
+	if (!params) { urlOpen(tag, from); return; }
 	size_t to = strtoul(strsep(&params, "-,"), NULL, 0);
 	if (to < from) to = from;
 	for (size_t i = from; i <= to; ++i) {
-		urlOpen(i);
+		urlOpen(tag, i);
 	}
 }
 
+static void inputView(struct Tag tag, char *params) {
+	char *view = strsep(&params, " ");
+	if (!view) return;
+	size_t num = strtoul(view, &view, 0);
+	tag = (view[0] ? tagName(view) : tagNum(num));
+	if (tag.name) uiFocus(tag);
+}
+
 static const struct {
 	const char *command;
 	Handler handler;
 } COMMANDS[] = {
+	{ "/join", inputJoin },
 	{ "/me", inputMe },
 	{ "/names", inputWho },
 	{ "/nick", inputNick },
@@ -99,27 +121,28 @@ static const struct {
 	{ "/quit", inputQuit },
 	{ "/topic", inputTopic },
 	{ "/url", inputUrl },
+	{ "/view", inputView },
 	{ "/who", inputWho },
 };
 static const size_t COMMANDS_LEN = sizeof(COMMANDS) / sizeof(COMMANDS[0]);
 
-void input(char *input) {
+void input(struct Tag tag, char *input) {
 	if (input[0] != '/') {
-		privmsg(false, input);
+		privmsg(tag, false, input);
 		return;
 	}
 	char *command = strsep(&input, " ");
 	if (input && !input[0]) input = NULL;
 	for (size_t i = 0; i < COMMANDS_LEN; ++i) {
 		if (strcasecmp(command, COMMANDS[i].command)) continue;
-		COMMANDS[i].handler(input);
+		COMMANDS[i].handler(tag, input);
 		return;
 	}
-	uiFmt("%s isn't a recognized command", command);
+	uiFmt(TAG_DEFAULT, "%s isn't a recognized command", command);
 }
 
 void inputTab(void) {
 	for (size_t i = 0; i < COMMANDS_LEN; ++i) {
-		tabTouch(COMMANDS[i].command);
+		tabTouch(TAG_DEFAULT, COMMANDS[i].command);
 	}
 }