diff options
author | June McEnroe <june@causal.agency> | 2018-08-10 23:31:20 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2018-08-10 23:31:20 -0400 |
commit | 07c750d25cf26883507d46bf319e55d2e35d6a94 (patch) | |
tree | dcf7dbc50dd717a1190c2f034ff440badf5a525c /input.c | |
parent | Move process spawning onto the event loop (diff) | |
download | catgirl-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.c | 75 |
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(¶ms, " "); 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(¶ms, " "); + 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(¶ms, "-,"), NULL, 0); - if (!params) { urlOpen(from); return; } + if (!params) { urlOpen(tag, from); return; } size_t to = strtoul(strsep(¶ms, "-,"), 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(¶ms, " "); + 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); } } |