Commit Diff
Diff:
625b854ff8288e828bcb27bfd13d448345095d69
1424bcef233cd5c17a6beff4e0be25e857867748
Commit:
1424bcef233cd5c17a6beff4e0be25e857867748
Tree:
8f4574de1b50233b1c5fec4a90982daf793faf12
Author:
jrmu <jrmu@ircnow.org>
Committer:
jrmu <jrmu@ircnow.org>
Date:
Sun Nov 15 13:27:42 2020 UTC
Message:
Fixed captcha bug; users can now specify modules
blob - 3b556c8f58c023ddc8c08b4a36bb786cbc25a55f
blob + 03c1fdfae3c125ad1b691907d57e6f20401faeab
--- BNC.pm
+++ BNC.pm
@@ -10,52 +10,50 @@ use Data::Dumper;
use MIME::Base64;
use Digest::SHA qw(sha256_hex);
use lib './';
-use SQLite;
-use Hash;
+require "SQLite.pm";
+require "Hash.pm";
+require "DNS.pm";
+require "Mail.pm";
-my %conf;
-my $chans;
-my $teamchans;
-my @teamchans;
-my $staff;
-my $zncdir;
-my $znclog;
+my %conf = %main::conf;
+my $chans = $conf{chans};
+my $teamchans = $conf{teamchans};
+my @teamchans = split /[,\s]+/m, $teamchans;
+my $staff = $conf{staff};
+my $zncdir = $conf{zncdir};
+my $znclog = $conf{znclog} || "$zncdir/.znc/moddata/adminlog/znc.log";
my $captchaURL = "https://guava.ircnow.org/captcha.php?vhost=";
-my $hostname;
-my $terms;
+my $hostname = $conf{hostname};
+my $terms = $conf{terms};
my @logs;
-my $expires;
-my $sslport;
-my $plainport;
-my $mailfrom;
-my $mailname;
+my $expires = $conf{expires};
+my $sslport = $conf{sslport};
+my $plainport = $conf{plainport};
+my $mailfrom = $conf{mailfrom};
+my $mailname = $conf{mailname};
+my $zncconfpath = $conf{zncconfpath} || "$zncdir/.znc/configs/znc.conf";
+my $znctree = { Node => "root" };
+
use constant {
NONE => 0,
ERRORS => 1,
WARNINGS => 2,
ALL => 3,
};
-my $zncconfpath;
-my $znctree = { Node => "root" };
+my @zncconf = main::readarray($zncconfpath);
+$znctree = parseml($znctree, @zncconf);
+main::cbind("pub", "-", "bnc", \&mbnc);
+main::cbind("msg", "-", "bnc", \&mbnc);
+main::cbind("msg", "-", "regex", \&mregex);
+main::cbind("msg", "-", "foreach", \&mforeach);
+main::cbind("msgm", "-", "*", \&mcontrolpanel);
+main::cbind("msg", "-", "taillog", \&mtaillog);
+main::cbind("msg", "-", "lastseen", \&mlastseen);
+
sub init {
- %conf = %main::conf;
- $chans = $conf{chans};
- $teamchans = $conf{teamchans};
- @teamchans = split /[,\s]+/m, $teamchans;
- $staff = $conf{staff};
- $zncdir = $conf{zncdir};
- $znclog = $conf{znclog} || "$zncdir/.znc/moddata/adminlog/znc.log";
- $zncconfpath = $conf{zncconfpath} || "$zncdir/.znc/configs/znc.conf";
- $expires = $conf{expires};
#znc.conf file
unveil("$zncconfpath", "r") or die "Unable to unveil $!";
- $hostname = $conf{hostname};
- $terms = $conf{terms};
- $sslport = $conf{sslport};
- $plainport = $conf{plainport};
- $mailfrom = $conf{mailfrom};
- $mailname = $conf{mailname};
#dependencies for figlet
unveil("/usr/local/bin/figlet", "rx") or die "Unable to unveil $!";
unveil("/usr/lib/libc.so.95.1", "r") or die "Unable to unveil $!";
@@ -63,15 +61,6 @@ sub init {
unveil("/usr/bin/tail", "rx") or die "Unable to unveil $!";
#znc.log file
unveil("$znclog", "r") or die "Unable to unveil $!";
- main::cbind("pub", "-", "bnc", \&mbnc);
- main::cbind("msg", "-", "bnc", \&mbnc);
- main::cbind("msg", "-", "regex", \&mregex);
- main::cbind("msg", "-", "foreach", \&mforeach);
- main::cbind("msgm", "-", "*", \&mcontrolpanel);
- main::cbind("msg", "-", "taillog", \&mtaillog);
- main::cbind("msg", "-", "lastseen", \&mlastseen);
- my @zncconf = main::readarray($zncconfpath);
- $znctree = parseml($znctree, @zncconf);
#print treeget($znctree, "AnonIPLimit")."\n";
#print treeget($znctree, "ServerThrottle")."\n";
#print treeget($znctree, "ConnectDelay")."\n";
@@ -183,7 +172,8 @@ sub mbnc {
}
if ($text =~ /^captcha\s+([[:alnum:]]+)/) {
my $text = $1;
- my $ircid = SQLite::id("irc", "hostmask", $hostmask, $expires);
+ # TODO avoid using host mask because cloaking can cause problems
+ my $ircid = SQLite::id("irc", "nick", $nick, $expires);
my $captcha = SQLite::get("bnc", "ircid", $ircid, "captcha");
if ($text ne $captcha) {
main::putserv($bot, "PRIVMSG $nick :Wrong captcha. To get a new captcha, type !bnc <username> <email>");
blob - 83071b696ac9d6bb680ab6a789660767ef5f7d69
blob + 0b47be080b5d041981aef6464e19946aa0327fcb
--- DNS.pm
+++ DNS.pm
@@ -9,54 +9,43 @@ use OpenBSD::Unveil;
use Data::Dumper;
use File::Copy qw(copy);
-my %conf;
-my $chans;
-my $staff;
-my $key;
-my $hash;
-my $hostname;
-my $verbose;
-my $ipv4;
-my $zonedir;
-my $ipv6path;
-my $hostnameif;
+my %conf = %main::conf;
+my $chans = $conf{chans};
+my $staff = $conf{staff};
+my $key = $conf{key};
+my $hash = $conf{hash};
+my $hostname = $conf{hostname};
+my $verbose = $conf{verbose};
+my $ipv4 = $conf{ipv4};
+my $zonedir = $conf{zonedir};
+my $ipv6path = $conf{ipv6path};
+my $hostnameif = $conf{hostnameif};
+# Validate ipv6s if it exists, otherwise load addresses from /etc/hostname.if
my @ipv6s;
+if (!(-s "$ipv6path")) {
+ print "No IPv6 addresses in $ipv6path, loading from $hostnameif...\n";
+ @ipv6s = readipv6s($hostnameif);
+} else {
+ @ipv6s = readipv6s($ipv6path);
+}
+if (!@ipv6s) { die "No IPv6 addresses in $ipv6path or $hostnameif!"; }
+if (host($hostname) =~ /(\d+\.){3,}\d+/) {
+ $ipv4 = $&;
+}
+main::cbind("msg", "-", "setrdns", \&msetrdns);
+main::cbind("msg", "-", "delrdns", \&mdelrdns);
+main::cbind("msg", "-", "setdns", \&msetdns);
+main::cbind("msg", "-", "deldns", \&mdeldns);
+main::cbind("msg", "-", "host", \&mhost);
+main::cbind("msg", "-", "nextdns", \&mnextdns);
sub init {
- %conf = %main::conf;
- $chans = $conf{chans};
- $staff = $conf{staff};
- $key = $conf{key};
- $hash = $conf{hash};
- $hostname = $conf{hostname};
- $verbose = $conf{verbose};
- $ipv4 = $conf{ipv4};
- $zonedir = $conf{zonedir};
- $ipv6path = $conf{ipv6path};
- $hostnameif = $conf{hostnameif};
unveil("$ipv6path", "rwc") or die "Unable to unveil $!";
unveil("$zonedir", "rwc") or die "Unable to unveil $!";
#dependencies for doas
unveil("/usr/bin/doas", "rx") or die "Unable to unveil $!";
#dependencies for host
unveil("/usr/bin/host", "rx") or die "Unable to unveil $!";
- main::cbind("msg", "-", "setrdns", \&msetrdns);
- main::cbind("msg", "-", "delrdns", \&mdelrdns);
- main::cbind("msg", "-", "setdns", \&msetdns);
- main::cbind("msg", "-", "deldns", \&mdeldns);
- main::cbind("msg", "-", "host", \&mhost);
- main::cbind("msg", "-", "nextdns", \&mnextdns);
- # Validate ipv6s if it exists, otherwise load addresses from /etc/hostname.if
- if (!(-s "$ipv6path")) {
- print "No IPv6 addresses in $ipv6path, loading from $hostnameif...\n";
- @ipv6s = readipv6s($hostnameif);
- } else {
- @ipv6s = readipv6s($ipv6path);
- }
- if (!@ipv6s) { die "No IPv6 addresses in $ipv6path or $hostnameif!"; }
- if (host($hostname) =~ /(\d+\.){3,}\d+/) {
- $ipv4 = $&;
- }
}
sub msetrdns {
blob - d7e2450e2724582bb54be4c682350b42126c21be
blob + b0f8dc9f896801ed80cf43e99367f31ffcf14a67
--- Hash.pm
+++ Hash.pm
@@ -8,17 +8,15 @@ use OpenBSD::Pledge;
use OpenBSD::Unveil;
use Data::Dumper;
-my %conf;
+my %conf = %main::conf;
my @words;
my $wordspath = "words";
-my $passlength;
+my $passlength = $conf{passlength};
+# dictionary words for passwords
+@words = main::readarray("words");
sub init {
- %conf = %main::conf;
- $passlength = $conf{passlength};
- # dictionary words for passwords
unveil($wordspath, "r") or die "Unable to unveil $!";
- @words = main::readarray("words");
}
sub newpass {
blob - 9db4dde97ad2d13ad4ee072d8b42db828b1b482c
blob + 0f2f7964c4eafecd5398145c869c65f1d5c8e09f
--- Help.pm
+++ Help.pm
@@ -7,24 +7,18 @@ use warnings;
use OpenBSD::Pledge;
use OpenBSD::Unveil;
-my %conf;
-my $chans;
-my $teamchans;
-my @teamchans;
-my $staff;
-my $terms;
+my %conf = %main::conf;
+my $chans = $conf{chans};
+my $teamchans = $conf{teamchans};
+my @teamchans = split /[,\s]+/m, $teamchans;
+my $staff = $conf{staff};
+my $terms = $conf{terms};
my $time = "600";
+main::cbind("pub", "-", "help", \&help);
+main::cbind("msg", "-", "help", \&help);
+main::cbind("pub", "-", "request", \&help);
sub init {
- %conf = %main::conf;
- $chans = $conf{chans};
- $teamchans = $conf{teamchans};
- @teamchans = split /[,\s]+/m, $teamchans;
- $staff = $conf{staff};
- $terms = $conf{terms};
- main::cbind("pub", "-", "help", \&help);
- main::cbind("msg", "-", "help", \&help);
- main::cbind("pub", "-", "request", \&help);
}
sub help {
blob - d54ee5dadb91b9d89b42799efab91e9eb31f23df
blob + 783bd370cc80eaccb3c1fbdaa6748c3e8abcf3a1
--- Mail.pm
+++ Mail.pm
@@ -9,26 +9,20 @@ use OpenBSD::Unveil;
use MIME::Base64;
use Digest::SHA qw(sha256_hex);
-my %conf;
-my $staff;
-my $hostname;
-my $mailfrom;
-my $mailname;
+my %conf = %main::conf;
+my $staff = $conf{staff};
+my $hostname = $conf{hostname};
+my $mailfrom = $conf{mailfrom};
+my $mailname = $conf{mailname};
+main::cbind("msg", "-", "mail", \&mmail);
sub init {
- %conf = %main::conf;
- $staff = $conf{staff};
- $hostname = $conf{hostname};
- $mailfrom = $conf{mailfrom};
- $mailname = $conf{mailname};
#dependencies for encrypt
unveil("/usr/bin/encrypt", "rx") or die "Unable to unveil $!";
#dependencies for mail
unveil("/usr/sbin/sendmail", "rx") or die "Unable to unveil $!";
unveil("/usr/lib/libutil.so.13.1", "r") or die "Unable to unveil $!";
unveil("/bin/sh", "rx") or die "Unable to unveil $!";
-
- main::cbind("msg", "-", "mail", \&mmail);
}
sub mmail {
my ($bot, $nick, $host, $hand, $text) = @_;
@@ -55,7 +49,7 @@ Content-Disposition: inline
$body
EOF
-open(my $fh, "| /usr/sbin/sendmail -tv -F $fromname -f $from") or die "Could not send mail $!";
+open(my $fh, "| /usr/sbin/sendmail -tv -F '$fromname' -f $from") or die "Could not send mail $!";
print $fh $msg;
close $fh;
return "true";
blob - 6ea25e42945e5d480da2d1f8ccdca1ab979f3ad4
blob + 1c395c4c2cac330881f4541c1e9ecd08d56348d1
--- SQLite.pm
+++ SQLite.pm
@@ -6,6 +6,7 @@ use strict;
use warnings;
use OpenBSD::Pledge;
use OpenBSD::Unveil;
+use Data::Dumper;
use DBI;
use DBD::SQLite;
@@ -15,27 +16,24 @@ use constant {
WARNINGS => 2,
ALL => 3,
};
-my %conf;
-my $staff;
+my %conf = %main::conf;
+my $staff = $conf{staff};
my $dbh;
-my $verbose;
+my $verbose = $conf{verbose};
my $dbpath = "/var/www/botnow/botnow.db";
my $database = "/var/www/botnow/"; # database path
+main::cbind("msg", "-", "get", \&mget);
+main::cbind("msg", "-", "set", \&mset);
+main::cbind("msg", "-", "connectdb", \&mconnectdb);
+main::cbind("msg", "-", "insert", \&minsert);
+main::cbind("msg", "-", "update", \&mupdate);
+main::cbind("msg", "-", "delete", \&mdelete);
+main::cbind("msg", "-", "select", \&mselect);
sub init {
- %conf = %main::conf;
- $staff = $conf{staff};
- $verbose = $conf{verbose};
unveil("$dbpath", "rwc") or die "Unable to unveil $!";
unveil("$dbpath-journal", "rwc") or die "Unable to unveil $!";
unveil("$database", "rwxc") or die "Unable to unveil $!";
- main::cbind("msg", "-", "get", \&mget);
- main::cbind("msg", "-", "set", \&mset);
- main::cbind("msg", "-", "connectdb", \&mconnectdb);
- main::cbind("msg", "-", "insert", \&minsert);
- main::cbind("msg", "-", "update", \&mupdate);
- main::cbind("msg", "-", "delete", \&mdelete);
- main::cbind("msg", "-", "select", \&mselect);
}
# !connectdb
@@ -298,6 +296,9 @@ sub set {
sub id {
my ($table, $key, $val, $expires) = @_;
my @rows = selectrows($table, $key, $val);
+ if (scalar(@rows) == 0) {
+ print "table => $table, key => $key, val => $val\n\n";
+ }
my $maxrow;
foreach my $row (@rows) {
if (!defined($maxrow)) { $maxrow = $row; }
blob - 7ceaffa2a66f7d7b4fa659543990887557470816
blob + 4a785baf654fd22f7014dfb7b88ea23822ecc6da
--- Shell.pm
+++ Shell.pm
@@ -10,35 +10,27 @@ use MIME::Base64;
use Data::Dumper;
use Digest::SHA qw(sha256_hex);
use lib './';
-use SQLite;
-use Hash;
+require "SQLite.pm";
+require "Hash.pm";
-my %conf;
-my $chans;
-my $teamchans;
-my @teamchans;
-my $staff;
+my %conf = %main::conf;
+my $chans = $conf{chans};
+my $teamchans = $conf{teamchans};
+my @teamchans = split /[,\s]+/m, $teamchans;
+my $staff = $conf{staff};
my $captchaURL = "https://guava.ircnow.org/captcha.php?vhost=";
-my $hostname;
-my $terms;
-my $expires;
-my $mailfrom;
-my $mailname;
+my $hostname = $conf{hostname};
+my $terms = $conf{terms};
+my $expires = $conf{expires};
+my $mailfrom = $conf{mailfrom};
+my $mailname = $conf{mailname};
my $passpath = "/etc/passwd";
my $httpdconfpath = "/etc/httpd.conf";
my $acmeconfpath = "/etc/acme-client.conf";
+main::cbind("pub", "-", "shell", \&mshell);
+main::cbind("msg", "-", "shell", \&mshell);
sub init {
- %conf = %main::conf;
- $chans = $conf{chans};
- $teamchans = $conf{teamchans};
- @teamchans = split /[,\s]+/m, $teamchans;
- $staff = $conf{staff};
- $hostname = $conf{hostname};
- $terms = $conf{terms};
- $mailfrom = $conf{mailfrom};
- $mailname = $conf{mailname};
- $expires = $conf{expires};
#dependencies for figlet
unveil("/usr/local/bin/figlet", "rx") or die "Unable to unveil $!";
unveil("/usr/lib/libc.so.95.1", "r") or die "Unable to unveil $!";
@@ -56,8 +48,6 @@ sub init {
unveil("/bin/mkdir", "rx") or die "Unable to unveil $!";
unveil("/bin/ln", "rx") or die "Unable to unveil $!";
unveil("/home/", "rwxc") or die "Unable to unveil $!";
- main::cbind("pub", "-", "shell", \&mshell);
- main::cbind("msg", "-", "shell", \&mshell);
}
# !shell <username> <email>
blob - 3176c5d375658c4baa5e9debeb957edb4cb87820
blob + e35442332a028972b8374935d9c9db3fa4b4d766
--- botnow.conf.example
+++ botnow.conf.example
@@ -9,7 +9,7 @@
#hostname = example.ircnow.org
#External IPv4 address, plaintext and ssl port
-#ip4 = 192.168.0.1
+ip4 = 192.168.0.1
#plainport = 1337
#sslport = 31337
@@ -34,29 +34,17 @@ mailfrom = support@ircnow.org
key = ABCDE-FGHIJ-KLMNO
hash = ABCDEFGHIJKLMNOPQRST
+#Modules to load
+modules = BNC DNS Mail Shell SQLite WWW Hash Help
+
#Comment out the line below
die = You did not configure botnow.conf!
+#####################################
+# Advanced Options Below #
+# Do not edit unless needed #
+#####################################
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#Advanced Options
-
#Number of words in password
#passlength = 3
@@ -76,4 +64,4 @@ die = You did not configure botnow.conf!
#verbose = ERRORS
#Terms of Service
-#terms = IRCNow is a Christian network. Rules: no profanity, no porn, no illegal drugs, no gambling, no slander, no warez, no promoting violence, no spam, illegal cracking, or DDoS. Only one account per person. Don't share passwords. Full terms: https://ircnow.org/terms.php .
+#terms = IRCNow: Of the User, By the User, For the User. Rules: no profanity, no porn, no illegal drugs, no gambling, no slander, no warez, no promoting violence, no spam, illegal cracking, or DDoS. Only one account per person. Don't share passwords. Full terms: https://ircnow.org/terms.php
blob - 94fe4560c4fc87988416067d1f03b451a614c8c3
blob + 0d585dc92b0bcf6967680838a5a6e708acb9ff94
--- botnow.pl
+++ botnow.pl
@@ -1,20 +1,12 @@
#!/usr/bin/perl
use strict;
+no strict 'refs';
use warnings;
use IO::Socket;
use IO::Select;
use OpenBSD::Pledge;
use OpenBSD::Unveil;
-use lib './';
-use BNC;
-use DNS;
-use Mail;
-use Shell;
-use SQLite;
-use WWW;
-use Hash;
-use Help;
my $confpath = "botnow.conf";
our %conf;
@@ -39,7 +31,7 @@ $conf{port} = $conf{port} || 1337;
chomp($conf{hostname} = $conf{hostname} || `hostname`);
# External IPv4 address, plaintext and ssl port
-$conf{ip4} = $conf{ip4} || DNS::host($conf{hostname},4);
+$conf{ip4} = $conf{ip4} or die "ERROR: botnow.conf: ip4";
$conf{plainport} = $conf{plainport} || 1337;
$conf{sslport} = $conf{sslport} || 31337;
@@ -56,9 +48,7 @@ $conf{passlength} = $conf{passlength} || 3;
# Mail from address
if (!defined($conf{mailname})) {
if ($conf{mailfrom} =~ /^([^@]+)@/) {
- $conf{mailname} = $1;
- } else {
- die "ERROR: botnow.conf mailname";
+ $conf{mailname} = $1 or die "ERROR: botnow.conf mailname";
}
}
@@ -93,15 +83,18 @@ $conf{expires} = $conf{expires} || 1800; # time before
if(defined($conf{die})) { die $conf{die}; }
-# Initiate modules
-BNC::init();
-DNS::init();
-SQLite::init();
-Mail::init();
-Shell::init();
-WWW::init();
-Hash::init();
-Help::init();
+my @modules;
+if (defined($conf{modules})) {
+ @modules = split(/\s+/, $conf{modules});
+}
+use lib './';
+foreach my $mod (@modules) {
+ require "$mod.pm";
+}
+foreach my $mod (@modules) {
+ my $init = "${mod}::init";
+ $init->();
+}
our @networks;
my @bots;
@@ -109,8 +102,8 @@ my @months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep O
my @days = qw(Sun Mon Tue Wed Thu Fri Sat Sun);
my @chans = split /[,\s]+/m, $conf{chans};
my @teamchans;
-my $call;
if (defined($conf{teamchans})) { @teamchans = split /[,\s]+/m, $conf{teamchans}; }
+my $call;
my $botnick = $conf{nick};
my $host = $conf{host};
my $port = $conf{port};
@@ -261,9 +254,9 @@ while(my @ready = $sel->can_read) {
my ($hostmask, $nick, $host, $target, $text) = ($1, $2, $3, $4, $5);
if ($hostmask eq '*status!znc@znc.in' && $target =~ /^$botnick.?$/) {
if ($text =~ /Network ([[:ascii:]]+) doesn't exist./) {
- debug(ERRORS, "$1 is not connected");
+ debug(ERRORS, "$1 does not exist.");
} elsif ($text eq "You are currently disconnected from IRC. Use 'connect' to reconnect.") {
- debug(ERRORS, "not connected to $bot->{name}");
+ debug(ERRORS, "Not connected to $bot->{name}");
} elsif ($text =~ /Unable to load module (.*): Module (.*) already loaded./) {
debug(ALL, "Module $1 already loaded\n");
} else {
blob - 4972b4796b128ce465d7cb0029e8bb237ae94c48
blob + 9beed52acb0ce0b9a38eedf11d6313911dc53597
--- networks
+++ networks
@@ -9,8 +9,8 @@
# Please keep network names lowercase
# Please edit 0000net and ircnow to connect to the local server's IPv6 address
#
-0000net Your-IP-address 6667
-ircnow Your-IP-address 6667
+0000net 2605:6400:20:b4::1 6667
+ircnow 2605:6400:20:b4::1 6667
2600net irc.2600.net 6667
42net sol.42net.org 6667
#abandoned-irc irc.abandoned-irc.net ~6697
@@ -27,6 +27,7 @@ allrednc irc.allrednc.org ~6697
alphachat irc.alphachat.net +6697
amicachat irc.amicachat.net ~6697
amorlatino irc.amorlatino.org 6667
+#anonops irc.anonops.com +6697
anope irc.anope.org 6667
austnet irc.austnet.org +6697
atrum irc.atrum.org ~6697
@@ -50,8 +51,10 @@ chatgentr chat.gen.tr 6667
chathispano irc.chathispano.com +6697
chathub irc.chathub.org +6697
chating irc.chating.id 6667
+chatjunkies irc.chatjunkies.org +6697
chatlatino irc.chatlatinos.cl 9090
chatlounge irc.chatlounge.net +6697
+chatopia irc.chatopia.net +6697
chatplezier irc.chatplezier.com ~6697
chatspike irc.chatspike.net ~6697
chatzona irc.chatzona.org 6667
@@ -114,6 +117,7 @@ esper irc.esper.net +6697
euirc irc.euirc.net 6667
europnet irc.europnet.org 6667
evolu irc.evolu.net ~6697
+ewnix irc.ewnix.net +6697
exchat irc.exchat.net ~6697
explosionirc irc.explosionirc.net 6667
forumcerdas irc.forumcerdas.net ~6697
@@ -128,17 +132,20 @@ geeknode irc.geeknode.org +6697
geekshed irc.geekshed.net +6697
germanelite irc.german-elite.net ~6697
geveze irc.geveze.org 6667
+geyiktr irc.geyiktr.net 6667
gigairc irc.gigairc.net ~6697
gimp irc.gimp.org +6697
globalirc irc.global-irc.org 6667
globalirc-it irc.globalirc.it ~6697
greekirc irc.greekirc.net 6667
hackint irc.hackint.org +6697
+hackthissite irc.hackthissite.org +7000
hybridirc irc.hybridirc.com ~6697
icqchat irc.icq-chat.com +6697
insomnia irc.insomnia247.nl 6667
-irc4fun irc.irc4fun.net 6667
+irc4fun irc.irc4fun.net ~6697
irccloud irc.irccloud.com +6697
+ircd-hybrid irc.ircd-hybrid.org ~6697
ircfreakz irc.ircfreakz.net ~6697
ircgate irc.ircgate.it 6667
irchaven irc.irchaven.org 6667
@@ -161,6 +168,7 @@ kampungchat etnies6.ircd.link 6667
librairc irc.librairc.net ~6697
luatic irc.luatic.net 6667
magnet irc.shadowcat.co.uk 6667
+malikania malikania.fr ~6697
mibbit irc.mibbit.com ~6697
mindforge irc.mindforge.org 6667
myirc chat.myirc.net +6697
@@ -171,6 +179,7 @@ oftc irc6.oftc.net +6697
oltreirc irc.oltreirc.net +6697
onlinegamesnet irc.onlinegamesnet.net 6667
openjoke irc.openjoke.org ~6697
+overthewire ircs.overthewire.org +6697
#optilan irc.optilan.eu 6667
#p2p-net irc.p2p-network.net +6697
perl irc.perl.org 6667
@@ -230,6 +239,9 @@ rusnet irc.lucky.net 6660
#rusnet irc.odessa.ua 6660
#scenep2p irc.scenep2p.net ~6697
shadowcat irc.shadowcat.co.uk 6667
+shadowfire irc.shadowfire.org +7000
+shadowfire us.shadowfire.org +7000
+shadowfire eu.shadowfire.org +7000
simosnap irc.simosnap.com +6697
skychatz irc.skychatz.org ~6697
slashnet irc.slashnet.org +6697