2023-12-15 17:45:27 -05:00
|
|
|
#ifndef BOT_H
|
|
|
|
|
|
|
|
#include <libircclient.h>
|
|
|
|
|
|
|
|
#include <string.h>
|
2023-12-16 20:38:41 -05:00
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
extern syntax_setter_t syntax_functions[];
|
2023-12-15 17:45:27 -05:00
|
|
|
|
2023-12-16 20:51:49 -05:00
|
|
|
static irc_session_t * session;
|
|
|
|
static irc_callbacks_t callbacks;
|
2023-12-15 17:45:27 -05:00
|
|
|
|
2023-12-17 06:21:10 -05:00
|
|
|
void irc_message(const char * const message) {
|
2023-12-15 17:45:27 -05:00
|
|
|
irc_cmd_msg(session, channel, message);
|
|
|
|
}
|
|
|
|
|
2023-12-16 20:38:41 -05:00
|
|
|
static
|
|
|
|
language_t translate_language(const char * const language) {
|
|
|
|
if (!strcmp(language, "C") || !strcmp(language, "C++")) {
|
|
|
|
return C;
|
|
|
|
} else if (!strcmp(language, "ADA")) {
|
|
|
|
return ADA;
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2023-12-17 06:21:10 -05:00
|
|
|
static
|
|
|
|
void irc_help() {
|
|
|
|
irc_message(PROGRAM_NAME " "
|
|
|
|
#include "version.inc"
|
|
|
|
);
|
|
|
|
irc_message(PROGRAM_NAME " is a code highlighting IRC bot."
|
|
|
|
" You may direct message it with your code or commands."
|
|
|
|
);
|
|
|
|
irc_message("Syntax:");
|
|
|
|
irc_message(" !help // print help");
|
|
|
|
irc_message(" !<language> // set language for next message");
|
|
|
|
irc_message(" <code> // echo this code");
|
|
|
|
irc_message(" !<language> <code> // set language and echo code");
|
|
|
|
irc_message("--");
|
|
|
|
}
|
|
|
|
|
2023-12-16 20:38:41 -05:00
|
|
|
// XXX: msg ChanServ IDENTIFY?
|
2023-12-16 20:51:49 -05:00
|
|
|
static
|
2023-12-15 17:45:27 -05:00
|
|
|
void event_connect(irc_session_t * session,
|
|
|
|
const char * event,
|
|
|
|
const char * origin,
|
|
|
|
const char ** params,
|
|
|
|
unsigned int count) {
|
|
|
|
(void)event;
|
|
|
|
(void)origin;
|
|
|
|
(void)params;
|
|
|
|
(void)count;
|
2023-12-15 18:23:46 -05:00
|
|
|
|
2023-12-15 17:45:27 -05:00
|
|
|
log_notice("IRC connection secured.");
|
|
|
|
irc_cmd_join(session, channel, 0);
|
2023-12-15 18:23:46 -05:00
|
|
|
char * buffer;
|
|
|
|
asprintf(&buffer, "Joined destination channel: `%s`.", channel);
|
|
|
|
log_notice(buffer);
|
|
|
|
free(buffer);
|
2023-12-15 17:45:27 -05:00
|
|
|
}
|
|
|
|
|
2023-12-16 20:51:49 -05:00
|
|
|
static
|
2023-12-15 18:23:46 -05:00
|
|
|
void event_privmsg(irc_session_t * session,
|
|
|
|
const char * event,
|
|
|
|
const char * origin,
|
|
|
|
const char ** params,
|
|
|
|
unsigned int count) {
|
2023-12-15 17:45:27 -05:00
|
|
|
(void)session;
|
|
|
|
(void)event;
|
|
|
|
(void)count;
|
2023-12-15 18:23:46 -05:00
|
|
|
|
2023-12-16 20:38:41 -05:00
|
|
|
char * const message_guard = strdup(params[1]);
|
|
|
|
char * message = message_guard;
|
|
|
|
char * terminator;
|
|
|
|
int is_code = 1;
|
|
|
|
|
2023-12-17 06:21:10 -05:00
|
|
|
/* Is command */
|
2023-12-16 20:38:41 -05:00
|
|
|
if (*message == '!') {
|
|
|
|
terminator = message;
|
|
|
|
while (*terminator != ' ') {
|
|
|
|
if (*terminator == '\0') {
|
|
|
|
is_code = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
++terminator;
|
|
|
|
}
|
|
|
|
*terminator = '\0';
|
2023-12-17 06:21:10 -05:00
|
|
|
/* */
|
|
|
|
if (!strcmp(message, "!help")) {
|
|
|
|
irc_help();
|
|
|
|
goto END;
|
|
|
|
}
|
|
|
|
/* get language */
|
2023-12-16 20:38:41 -05:00
|
|
|
for (char * s = message + 1; *s != '\0'; s++) {
|
|
|
|
*s = toupper(*s);
|
|
|
|
}
|
|
|
|
int l = translate_language(message + 1);
|
|
|
|
message = terminator + 1;
|
|
|
|
if (l != -1) {
|
|
|
|
language = l;
|
2023-12-17 06:21:10 -05:00
|
|
|
syntax_count = 0;
|
2023-12-16 20:38:41 -05:00
|
|
|
syntax_functions[language]();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-12-17 06:21:10 -05:00
|
|
|
/* Is code */
|
2023-12-16 20:38:41 -05:00
|
|
|
if (is_code) {
|
|
|
|
char * buffer = (char *)origin;
|
|
|
|
while (*(buffer++) != '!') { ; }
|
|
|
|
asprintf(&buffer, "From %.*s:", (int)(buffer - origin)-1, origin);
|
2023-12-17 06:21:10 -05:00
|
|
|
irc_message(buffer);
|
2023-12-16 20:38:41 -05:00
|
|
|
free(buffer);
|
|
|
|
|
2023-12-17 06:21:10 -05:00
|
|
|
irc_message(syntax_highlight(message));
|
2023-12-16 20:38:41 -05:00
|
|
|
|
2023-12-17 06:21:10 -05:00
|
|
|
irc_message("--");
|
2023-12-16 20:38:41 -05:00
|
|
|
}
|
2023-12-15 18:23:46 -05:00
|
|
|
|
2023-12-17 06:21:10 -05:00
|
|
|
END:
|
2023-12-16 20:38:41 -05:00
|
|
|
free(message_guard);
|
2023-12-15 17:45:27 -05:00
|
|
|
}
|
|
|
|
|
2023-12-17 06:21:10 -05:00
|
|
|
static
|
|
|
|
void event_channel(irc_session_t * session,
|
|
|
|
const char * event,
|
|
|
|
const char * origin,
|
|
|
|
const char ** params,
|
|
|
|
unsigned int count) {
|
|
|
|
(void) session;
|
|
|
|
(void) event;
|
|
|
|
(void) origin;
|
|
|
|
(void) count;
|
|
|
|
|
|
|
|
const char * const message = params[1];
|
|
|
|
|
|
|
|
if (!strncmp(message, "!help", sizeof("!help")-1)) {
|
|
|
|
irc_help();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-12-15 17:45:27 -05:00
|
|
|
int connect_bot(const char * const server, const short port) {
|
|
|
|
memset(&callbacks, 0, sizeof(callbacks));
|
|
|
|
callbacks.event_connect = event_connect;
|
2023-12-15 18:23:46 -05:00
|
|
|
callbacks.event_privmsg = event_privmsg;
|
2023-12-17 06:21:10 -05:00
|
|
|
callbacks.event_channel = event_channel;
|
2023-12-15 17:45:27 -05:00
|
|
|
session = irc_create_session(&callbacks);
|
|
|
|
|
|
|
|
if (!session) {
|
|
|
|
log_error("Error creating IRC session.");
|
|
|
|
return 1;
|
|
|
|
} else {
|
|
|
|
log_notice("IRC Session initialized.");
|
|
|
|
}
|
|
|
|
|
|
|
|
irc_connect(session,
|
|
|
|
server,
|
|
|
|
port,
|
|
|
|
password,
|
|
|
|
username,
|
|
|
|
username,
|
|
|
|
username
|
|
|
|
);
|
2023-12-15 18:23:46 -05:00
|
|
|
|
|
|
|
return 0;
|
2023-12-15 17:45:27 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
int connection_loop(void) {
|
|
|
|
if (irc_run(session) != 0) {
|
|
|
|
log_error("Error running IRC session\n"
|
|
|
|
"Possible issue: bad URL, no network connection, bad port, refused connection.");
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define BOT_H
|
|
|
|
#endif
|