Compare commits

..

No commits in common. "master" and "HxRawBot-v1.0" have entirely different histories.

2 changed files with 44 additions and 138 deletions

157
HxBot.hx
View File

@ -1,131 +1,62 @@
// Haxe RawBot v1.0
// Connects to IRC and joins #lobby
//
// Issues:
// - Does not detect connection loss
import sys.net.Host; import sys.net.Host;
import sys.net.Socket; import sys.net.Socket;
using StringTools;
class HxBot { class HxBot {
// Initialize variables public static function main() {
static var server = '127.0.0.1'; var server = new Host('127.0.0.1');
static var port = 6667; var port = 6667;
static var autojoin = ['#lobby']; var channel = '#lobby';
static var botnick = 'HxRawBot'; var botnick = 'HxRawBot';
static var irc = new Socket();
static var commandPrefix = "?"; // Program begins
static var authorized = ["Izwzyzx", "Ikewise"]; Sys.println('Connecting to ${Std.string(server)}:${Std.string(port)}...');
static var ping = false;
static var greetings = ["hi", "hello", "hey", "yo", "'lo"];
static function main() {
// Connect to server
Sys.println('Connecting to ${server}:${Std.string(port)}...');
Sys.println(""); Sys.println("");
irc.connect(new Host(server), port); var irc = new Socket();
irc.connect(server, port);
irc.write('NICK ${botnick}\n'); irc.write('NICK ${Std.string(botnick)}\n');
irc.write('USER ${botnick} ${botnick} ${botnick} :Haxe IRC bot\r\n'); irc.write('USER ${Std.string(botnick)} ${Std.string(botnick)} ${Std.string(botnick)} :Haxe IRC bot\r\n');
for (i in autojoin) { irc.write('JOIN :${Std.string(channel)}\r\n');
join(i);
} // Initialize our data vars
var data;
var source;
// Main program loop // Main program loop
while (true) { while (true) {
try { data = Std.string(irc.input.readLine());
var data = irc.input.readLine();
if (data.charAt(0) == ":") {data = data.substr(1);}; // Strip leading colons
// Respond to server pings, but only print the first to avoid console spam
if (data.indexOf("PING") == 0) {
irc.write('PONG${data.substr(data.indexOf(" "))}\r\n');
if (!ping) {
Sys.println('${data} (No further notifications)');
ping = true;
}
}
// Print everything that's not a server ping // Detect connection loss (from PyBot, not working in Haxe)
if (data.indexOf("PING") != 0) {Sys.println(data);} //if (dataReceived == "b''") {break;}
// Begin processing data Sys.println(data);
if (StringTools.contains(data.substring(0, data.indexOf(" ")), "!")) { // Checking for "nickname!user@host"
var sender = data.substring(0, data.indexOf("!")); // Respond to server pings
var hostmask = data.substring(data.indexOf("!")+1, data.indexOf(" ")); if (data.indexOf("PING") == 0) {
var action = data.substring(data.indexOf(" ")+1, data.indexOf(" ", data.indexOf(hostmask)+hostmask.length+1)); irc.write('PONG ${data.substring(data.indexOf(" ")+1)}\r\n');
var channel = data.substring(data.indexOf(" ", data.indexOf(action))+1, data.indexOf(" ", data.indexOf(action)+action.length+1)); }
var msg = data.substring(data.indexOf(" ", data.indexOf(channel))+1);
// Auto-Rejoin when kicked
if (msg.charAt(0) == ":") {msg = msg.substring(1);} // Strip leading colons if (data.indexOf("KICK #") == data.indexOf(" ")+1) {
source = data.substring(data.indexOf("#"), data.indexOf(" ", data.indexOf("#")));
// Auto-Rejoin when kicked irc.write('JOIN ${source}\r\n');
if ((action == "KICK") && (msg.substring(0, msg.indexOf(" ")) == botnick)) { }
irc.write('JOIN ${channel}\r\n');
} // Shutdown command
if (data.toLowerCase().indexOf("!quit") != -1) {
irc.write('QUIT :Shutdown\r\n');
// HxBot chat responses begin here
if (action == "PRIVMSG") {
// Command processor
if (msg.charAt(0) == commandPrefix) {
var command = "";
if (msg.indexOf(" ") != -1) {
// Separate command from rest of message, if necessary
command = msg.substring(1, msg.indexOf(" ")).toLowerCase();
msg = msg.substring(msg.indexOf(" ")+1);
} else {
// Otherwise, remove msg
command = msg.substring(1).toLowerCase();
msg = "";
}
switch (command) {
case "quit":
if (authorized.contains(sender)) {irc.write('QUIT :Received shutdown command from ${sender}\r\n');}
case "join":
if ((authorized.contains(sender)) && (msg.length > 0)) {join(msg);}
case "part":
if ((authorized.contains(sender)) && (msg.length > 0)) {part(msg);}
case "chk":
say(channel, '${sender}: ack');
case "slap":
if (msg.length != 0) {ctcp('PRIVMSG', channel, 'ACTION slaps ${msg} around a bit with a large trout');}
}
}
if (greetings.contains(msg.substring(0, msg.indexOf(" ")).toLowerCase())) {
if (msg.substring(msg.indexOf(" ")+1, msg.indexOf(" ")+botnick.length+1).toLowerCase() == botnick.toLowerCase()) {
say(channel, 'Hello, ${sender}!');
}
}
if (msg.contains('slaps ${botnick} around a bit with a large trout')) {
say(channel, "This is the Trout Protection Agency. Please put the Trout down and walk away with your hands in the air.");
}
if ((msg.charAt(0) == ".") && (msg.length == 1)) {say(channel, "omg a meteor");}
}
}
} catch (e:haxe.io.Eof) {
Sys.println("");
Sys.println('[Eof] Connection terminated.');
return;
} catch (e) {
trace('Uncaught: ${e}'); // throw e;
return;
} }
} }
} // End of program
Sys.println("");
// Define functions Sys.println('Connection terminated.');
public static function say(sendtarget, sendmsg) {
irc.write('PRIVMSG ${sendtarget} :${sendmsg}\r\n');
}
public static function ctcp(sendtype, sendtarget, sendmsg) {
irc.write('${sendtype} ${sendtarget} :\x01${sendmsg}\x01\r\n');
}
public static function join(chan) {
irc.write('JOIN :${chan}\r\n');
}
public static function part(chan) {
irc.write('PART '+ chan +'\r\n');
} }
} }

View File

@ -1,25 +0,0 @@
# HxBot
**HxBot** is an IRC bot written in Haxe. It is the successor project to [PyBot](https://forge.ds8.zone/Izwzyzx/PyBot) and [GimelBot](https://forge.ds8.zone/Izwzyzx/GimelBot).
The success of HxBot quickly led to the start of [onequestionmark-chat](https://forge.ds8.zone/Izwzyzx/onequestionmark-chat), which directly uses HxBot's command processor.
## Changelog
### HxRawBot v1.1
- ✔️ Cleaned code
- ✔️ Added exception catching
- ✔️ Changed command prefix to `?`
- ✔️ Added command processor
- ✔️ Channels joined on startup are now an array
- ✔️ Implemented functions
- ✔️ Implemented all chat commands from PyBot
- ✔️ Fix: Only accepts `?quit` from authorized users
- ✔️ Fix: No longer attempts rejoin when others are kicked
### HxRawBot v1.0
- ✔️ Connects to specified IRC server
- ✔️ Joins #lobby
- ✔️ Prints received messages to console
- ✔️ Responds to server pings
- ✔️ Rejoins channel when kicked
- ✔️ Responds to `!quit` command
- ❌ ~~Does not detect connection loss~~ (Haxe interpreter bug)