2018-08-02 04:29:35 +00:00
|
|
|
/* Copyright (C) 2018 Curtis McEnroe <june@causal.agency>
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Affero General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2018-08-04 17:35:29 +00:00
|
|
|
#define _WITH_GETLINE
|
2018-08-04 03:54:28 +00:00
|
|
|
|
2018-08-02 04:29:35 +00:00
|
|
|
#include <err.h>
|
2018-08-03 23:22:28 +00:00
|
|
|
#include <errno.h>
|
2018-08-02 04:29:35 +00:00
|
|
|
#include <poll.h>
|
2018-08-05 01:23:28 +00:00
|
|
|
#include <signal.h>
|
2018-08-02 04:29:35 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <sysexits.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
2018-08-04 17:35:29 +00:00
|
|
|
#include "chat.h"
|
2018-08-03 02:29:10 +00:00
|
|
|
|
2018-08-05 01:23:28 +00:00
|
|
|
static void sigint(int sig) {
|
|
|
|
(void)sig;
|
2018-08-07 19:43:49 +00:00
|
|
|
input("/quit");
|
2018-08-05 01:23:28 +00:00
|
|
|
uiHide();
|
|
|
|
exit(EX_OK);
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *prompt(const char *prompt) {
|
2018-08-04 17:35:29 +00:00
|
|
|
char *line = NULL;
|
|
|
|
size_t cap;
|
2018-08-03 18:13:41 +00:00
|
|
|
for (;;) {
|
2018-08-04 17:35:29 +00:00
|
|
|
printf("%s", prompt);
|
|
|
|
fflush(stdout);
|
2018-08-03 02:29:10 +00:00
|
|
|
|
2018-08-04 17:35:29 +00:00
|
|
|
ssize_t len = getline(&line, &cap, stdin);
|
|
|
|
if (ferror(stdin)) err(EX_IOERR, "getline");
|
|
|
|
if (feof(stdin)) exit(EX_OK);
|
|
|
|
if (len < 2) continue;
|
2018-08-03 23:34:19 +00:00
|
|
|
|
2018-08-04 17:35:29 +00:00
|
|
|
line[len - 1] = '\0';
|
|
|
|
return line;
|
2018-08-03 23:17:29 +00:00
|
|
|
}
|
2018-08-03 02:29:10 +00:00
|
|
|
}
|
2018-08-02 04:29:35 +00:00
|
|
|
|
|
|
|
int main(int argc, char *argv[]) {
|
2018-08-04 17:35:29 +00:00
|
|
|
char *host = NULL;
|
2018-08-04 17:43:36 +00:00
|
|
|
const char *port = "6697";
|
2018-08-02 04:29:35 +00:00
|
|
|
const char *webPass = NULL;
|
|
|
|
|
|
|
|
int opt;
|
2018-08-03 02:29:10 +00:00
|
|
|
while (0 < (opt = getopt(argc, argv, "h:j:n:p:vw:"))) {
|
2018-08-02 04:29:35 +00:00
|
|
|
switch (opt) {
|
2018-08-04 17:35:29 +00:00
|
|
|
break; case 'h': host = strdup(optarg);
|
|
|
|
break; case 'j': chat.chan = strdup(optarg);
|
|
|
|
break; case 'n': chat.nick = strdup(optarg);
|
2018-08-04 17:43:36 +00:00
|
|
|
break; case 'p': port = optarg;
|
2018-08-04 17:35:29 +00:00
|
|
|
break; case 'v': chat.verbose = true;
|
2018-08-02 04:29:35 +00:00
|
|
|
break; case 'w': webPass = optarg;
|
|
|
|
break; default: return EX_USAGE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-04 17:35:29 +00:00
|
|
|
if (!host) host = prompt("Host: ");
|
|
|
|
if (!chat.chan) chat.chan = prompt("Join: ");
|
|
|
|
if (!chat.nick) chat.nick = prompt("Name: ");
|
|
|
|
chat.user = strdup(chat.nick);
|
2018-08-02 04:29:35 +00:00
|
|
|
|
2018-08-05 01:23:28 +00:00
|
|
|
signal(SIGINT, sigint);
|
|
|
|
|
2018-08-03 02:29:10 +00:00
|
|
|
uiInit();
|
2018-08-06 18:19:52 +00:00
|
|
|
uiLog(L"Traveling...");
|
2018-08-03 02:29:10 +00:00
|
|
|
uiDraw();
|
2018-08-02 04:29:35 +00:00
|
|
|
|
2018-08-04 21:54:46 +00:00
|
|
|
int sock = ircConnect(host, port, webPass);
|
2018-08-04 17:35:29 +00:00
|
|
|
free(host);
|
2018-08-02 04:29:35 +00:00
|
|
|
|
|
|
|
struct pollfd fds[2] = {
|
|
|
|
{ .fd = STDIN_FILENO, .events = POLLIN },
|
2018-08-04 17:35:29 +00:00
|
|
|
{ .fd = sock, .events = POLLIN },
|
2018-08-02 04:29:35 +00:00
|
|
|
};
|
2018-08-03 23:22:28 +00:00
|
|
|
for (;;) {
|
|
|
|
int nfds = poll(fds, 2, -1);
|
2018-08-04 19:04:48 +00:00
|
|
|
if (nfds < 0) {
|
|
|
|
if (errno != EINTR) err(EX_IOERR, "poll");
|
|
|
|
fds[0].revents = POLLIN;
|
|
|
|
fds[1].revents = 0;
|
|
|
|
}
|
2018-08-03 23:22:28 +00:00
|
|
|
|
2018-08-03 02:29:10 +00:00
|
|
|
if (fds[0].revents) uiRead();
|
2018-08-04 21:54:46 +00:00
|
|
|
if (fds[1].revents) ircRead();
|
2018-08-03 02:29:10 +00:00
|
|
|
uiDraw();
|
2018-08-02 04:29:35 +00:00
|
|
|
}
|
|
|
|
}
|