diff --git a/README.md b/README.md new file mode 100644 index 0000000..67472c3 --- /dev/null +++ b/README.md @@ -0,0 +1,192 @@ +# krylon - art spam micro botnet logic v3.01 +``` + .oydddhhyo+/-. + `hddddhhddddddddhso/. + .dddh. ``..-:+ohdh- + __ .__ -ddddds/-` -sd/` + | | _________ ___.__.| | ____ ____ :dd//sdddhys+/:-` sdy-. + | |/ /\_ __ < | || | / _ \ / \ ody `yhdhddddddhhs/:+ddd/ + | < | | \/\___ || |_( <_> ) | \ yd/ .hdh.hdhshddddddddddy + |__|_ \ |__| / ____||____/\____/|___| / `dh. `yddo:dd: ``-/+odddddo + \/ \/ \/ :hy +dddyhddhyo:. .sddddy: + +hy hddhdddhsyhdhohdddy:` + hdd` hdd/+hdhs//hddddy/` + .dddo`odd` .+yddddddh/` + `.--:://+-ydddyyds `+ddddh+` + .oso+. `:oyhhhddddddy.-odddd+ `:ydddh+. + :hddddh+`+ddddhyso++//+../ohddhyydddds. + +hdddds::..sdd/.` -hso+oosyyhyo+- + `odddhshy` `ody+-` -hdddy- ````+dh+ + `sdddy- -ys. /hddhs/-` .:+s/ -dddo + `yddh. `oy/` .+hddddhso/-..```````.:ydddd+`++. + `/hy+.` :yy+.` `/shdddddddhyyyssyyhddddddd-+dh/` + `/yhs-` `/yhs/.` ./shddyyyyyhdddddddddddo`oddds + `++-/yhy+-` -ohdy+:`` `-:+oyyysddddddddho-.odddds + .sddhs:-+hdhs/.`.:shdhyo:.`` `..-/+osso/:.-ohddddd: + `/hddddy- -/shdhs/--/ohdddhys+/:--..--:+shdddddddy + .sddddh/ `-+yhddyo+osyddddddddddddddddddddddd: + /hddddo` `-/oyhdddhddddddddddddddddddddds + .sddddy- `-/+shdddddddddddddddddddh. + /hdddh/ `.:/+osyhhhhhhys+/. + .:+syyy` .sddddo` /o. + .+ydddddddho- `-+ddddy- sdd+ + -sddddddhsoydddhhdddddh: .----. hddy + -sddddds/.`ohdddddddddd+` .:oyddddddddy/` .ddd+ + `odddddo. .ydddddhddddh- -+ydddddddhhhddddh/ +ddd- + /hddddh: .yhddo-.``odd/ .+hddddho/-.` `:ohhho` `hddh + -ydddddd- `yddd: od. -sddddh+-` `/yho oddd: + `+ddddddd+ +ddd: .d` .sdddds:` -ddodddy + -ydddh/hdd. `hddo h- `/hdddy- yddddh. + ydddo` hhy -ddh` so .` `sdddh/` .ddddd: + ddd+ shy :ddo -h/.``:/ `ydddy. sdddd/ + hdd: /dh :dd/ :hhyhs` oddds` odddd/ + odd/ `dd` .dd/ `/o/` `ddds` `sdddh: + .hdo od/ sdo .ddd- -ydddh- + +dh` `hy -dh` `hdd- `+hddds. + `yd+ /d/ od+ +dd/ `/hdddh/` + .hd/ oh- `yh- `sdh. ./ydddds- + -hd/ `yh- .yh. `odh+. `-ohddddy:` + .yd/ `yh- .yh: :yhhs+:----/oydddddy/` + .sdo` .yh: `sdo` `/ydddddddddddddy/` + `ody. `oy/` `+hy:` `-ohddddddddy/` + /hs-` `+sy- -yds- `` `./shdddddho- + -yy+. :hdo` `/hds:` -:.`` ``./sddddddho:` + `odh/` -ydh/` .+hdy+-` .syysyhddddddyo:` + :hdy- `+hdy/` .+hddhs+:---yddddddy+sd/ + `ohds- .ohdy/. `:shddddddddddddd:.ydh` + .shds:`-sdddo:` `:oyhhdddddddd+hddd- + -sddho::shddho:` `.-://///ohddh- + .+hdddsoydddddyo/-.` `odddy. + -ohddddddddddddddhhyhhddd+ + -+sdddddddddddddddddh- + .:+osyhdddddhys+` +``` +``` +## summary +``` +krylon v3.01 +``` +## changelog - v3.01 +``` +- rebased to integrate with dr1p4ns1 and m4pl1mp +``` +## screenshots +![screenshots](screenshots/s1.jpg) +![screenshots](screenshots/s2.jpg) +## overview +``` +**no comment** +``` +## prerequisites +- `python3` +## content +- run.sh - **main file** +## usage +- syntax: `bash run.sh` +## prerequisites +- `apt install python3` +- `apt install python3-pip` +- `python3 -m pip install virtualenv` +## installation +- `git clone --recursive https://git.tcp.direct/decoded/m4pl1mp.git` +- `cd m4pl1mp` +- `virtualenv env -p python3` +- `source env/bin/activate` +- `pip install -r requirements.txt` +## setting up environment +- `git clone --recursive https://git.tcp.direct/decoded/krylon.git` +## notes +``` +- 1 - plugins/fifo_plugin.py - change line 12 in this file from this example below as reference. +- 1 - self.runpath = self.config.get('runpath', '/home/dr1p/Documents/code/python/krylon/fifo') +- 1 - to whatever the path of your fifo pipe is.. if you are unsure point it to krylon directory. + +- 2 - when you run `bash run.sh` it generates a configuration file named `.krylon_config`, be sure +- 2 - to add this section so that your fifo plugin path directories are setup. also change this path +- 2 - to the same as the path you changed in the section above. + +[plugins.fifo_plugin] +runpath = /home/dr1p/Documents/code/python/krylon/fifo + +- 3 - also make sure the fifo/krylon plugins are enabled in this file. e.g. + +includes = + plugins.krylon + plugins.fifo + +- 4 - below is an example configuration file just for visual reference +- 4 - ~/code/krylon/.krylon_config + +[bot] +nick = dr1pp1ng +username = dr1p +realname = dr1pdr0p +host = 192.168.1.37 +port = 6667 +channel = #tcpdirect +version=1 +ssl = false + +includes = + irc3.plugins.command + irc3.plugins.asynchronious + irc3.plugins.storage + irc3.plugins.uptime + irc3.plugins.ctcp + irc3.plugins.cron + irc3.plugins.logger + irc3.plugins.userlist + plugins.b33p + plugins.krylon + plugins.fifo + +flood_burst = 0 +flood_rate = 1 +flood_rate_delay = 1 +storage = json://.krylon_database + +[irc3.plugins.command] +cmd = ? +guard = irc3.plugins.command.mask_based_policy + +[irc3.plugins.command.masks] +d!*dr1p@* = all_permissions +* = view + +ignore_list = + g1mp_!*@* + g1mp!*@* + +[plugins.fifo_plugin] +runpath = /home/dr1p/Documents/code/python/krylon/fifo + +[bot_1] +nick = ron17k_l5yad_ +username = 6dd7rp16 +channel = #tcpdirect + +[bot_2] +nick = _yk_92fr3onl2 +username = 2dpr11d +channel = #tcpdirect + +[bot_3] +nick = a3rk_3yn_10ol +username = p69dcr12 +channel = #tcpdirect + +[bot_4] +nick = 54r4_ko1lyn_6 +username = p1d61d5r +channel = #tcpdirect + +[bot_5] +nick = n_o7y5r8_clk +username = dr4a1dpd +channel = #tcpdirect + +[bot_6] +nick = e_6rlenk_1oy7 +username = pdrd27f1 +channel = #tcpdirect +``` \ No newline at end of file diff --git a/plugins/b33p.py b/plugins/b33p.py new file mode 100644 index 0000000..06d79c9 --- /dev/null +++ b/plugins/b33p.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from irc3.plugins.command import command +import irc3 + +@irc3.plugin +class Plugin: + + def __init__(self, bot): + self.bot = bot + + @command(permission='view') + def b33p(self, mask, target, args): + """b33p an irc b0t, it should b00p back + %%b33p ... + """ + robostep='{}: b00p'.format(mask.nick) + roooboot = ''.join(args['']) + if roooboot == self.bot.nick: + self.bot.privmsg(target,robostep) diff --git a/plugins/fifo.py b/plugins/fifo.py new file mode 100644 index 0000000..5923f38 --- /dev/null +++ b/plugins/fifo.py @@ -0,0 +1,100 @@ +import os +import irc3 +from stat import S_ISFIFO +#################################################################################################### +@irc3.plugin +class Fifo: + BLOCK_SIZE = 1024 + MAX_BUFFER_SIZE = 800 + ################################################################################################ + def __init__(self, context): + self.context = context + self.config = self.context.config + self.send_blank_line = self.config.get('send_blank_line', True) + self.runpath = self.config.get('runpath', '/home/dr1p/Documents/code/python/krylon/fifo') + if not os.path.exists(self.runpath): + os.makedirs(self.runpath) + self.loop = self.context.loop + self.fifos = {} + self.buffers = {} + self.context.duffer=[] + self.create_fifo(None) + ################################################################################################ + @classmethod + def read_fd(cls, fd): + while True: + try: + return os.read(fd, cls.BLOCK_SIZE) + except InterruptedError: + continue + except BlockingIOError: + return b"" + ################################################################################################ + def handle_line(self, line, channel): + if not line: + return + line = line.decode("utf8") + if not self.send_blank_line and not line.strip(): + return + if channel is None: + self.context.send_line(line) + else: + self.context.duffer.append(line) + print('+++ fifo line input received +++') + ################################################################################################ + def data_received(self, data, channel): + if not data: + return + prev = self.buffers.get(channel, b"") + lines = (prev + data).splitlines(True) + last = lines[-1] + for line in lines[:-1]: + line = line.rstrip(b'\r\n') + self.handle_line(line, channel) + if last.endswith(b'\n'): + line = last.rstrip(b'\r\n') + self.handle_line(line, channel) + self.buffers[channel] = b"" + return + if len(last) > self.MAX_BUFFER_SIZE: + self.handle_line(last, channel) + self.buffers[channel] = b"" + else: + self.buffers[channel] = last + ################################################################################################ + def watch_fd(self, fd, channel): + reading = True + while reading: + data = self.read_fd(fd) + reading = len(data) == self.BLOCK_SIZE + self.data_received(data, channel) + ################################################################################################ + def create_fifo(self, channel): + if channel is None: + path = os.path.join(self.runpath, ':raw') + else: + path = os.path.join(self.runpath, channel.strip('#&+')) + try: + mode = os.stat(path).st_mode + except OSError: + pass + else: + if not S_ISFIFO(mode): + self.context.log.warn( + 'file %s created without mkfifo. remove it', + path) + os.remove(path) + if not os.path.exists(path): + os.mkfifo(path) + fd = os.open(path, os.O_RDWR | os.O_NONBLOCK) + self.loop.add_reader(fd, self.watch_fd, fd, channel) + self.context.log.debug("%s's fifo is %s %r", + channel or ':raw', path, fd) + return fd + @irc3.event(irc3.rfc.JOIN) + ################################################################################################ + def join(self, mask=None, channel=None, **kwargs): + if mask.nick == self.context.nick: + if channel not in self.fifos: + self.fifos[channel] = self.create_fifo(channel) + ################################################################################################ \ No newline at end of file diff --git a/plugins/krylon.py b/plugins/krylon.py new file mode 100644 index 0000000..93a2577 --- /dev/null +++ b/plugins/krylon.py @@ -0,0 +1,153 @@ +# -*- coding: utf-8 -*- +"""################################################################################################# +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh+MMMMMMMMMMMMMMhsMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMm/ oMMMMMMMMMMMMMMm +NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMy` yMMMMMMMMMMMMMMM- -mMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMs+dMMMMMMMMMM+ sMMMMMMMMMMMMMMM- `dMMMMMMMMMMms/NMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMM+ .omMMMMMM: -MMMMMMMMMMMMMMo `yMMMMMMMy: `dMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMM- /dMMM+ sMMMMMMMMMMMMh `hMMMNo` sMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMd :dm `mMMMMMMMMMMN. .NNo` .MMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMM: - :MMMMMMMMMMs :` sMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMs ymNMMMMMNm. NMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMy `-/-` .MMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMo .NMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMNh+. :sdMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMhso+:. `-/+syMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMM- dMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMM` `.:+/. `/s+:. sMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMNo -oms. .//-` `:/:` `+md+` .hMMMMMMMMMMMMMMM +MMMMMMMMMMMMMNs` .odNdo. .ohmd+` :dMMMMMMMMMMMMM +MMMMMMMMMMMNo` .. .- :hMMMMMMMMMMM +MMMMMMMMMd+` -sNMMMMMMMM +MMMMMMNs- `.. `/-. `+dMMMMMM +MMMNy: ./sdNMMMh: `sNMMMNds/. .odMMM +MM+ :ymMMMMMMMMMMh. +NMMMMMMMMMMmo- /NM +MMMh: .sNMMMMMMMMMMMMMMN- `hMMMMMMMMMMMMMMMm+` :hMMM +MMMMMd:` ``-:+shmMMMMMMMMMMMMMMMMMMN. hMMMMMMMMMMMMMMMMMMMmhs+/-..``````./dMMMMM +MMMMMMMMMNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMo .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMy .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN. /MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN+` `+NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNs. -hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMdyymMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +#################################################################################################""" +from irc3.plugins.command import command +from irc3.plugins.cron import cron +from irc3 import rfc +import irc3 +#################################################################################################### +_botnicks=[] +_duffer=[] +_botops=[] +_botrot=[] +_botlok=0 +_botlvl=0 +#################################################################################################### +class KRYLON(): + ################################################################################################ + def __init__(self,bot,channel): + self.bot=bot + self.channel=channel +#################################################################################################### +@irc3.plugin +class Plugin(object): + ################################################################################################ + def __init__(self,context): + self.context=context + self.channel=context.config.channel + self.context.k=KRYLON(self.context,self.channel) + ################################################################################################ + def getbotnames(self): + return list(self.context.config.botnet.keys()) + ################################################################################################ + def getbotnicks(self): + botnicks=[] + for _ in self.getbotnames(): botnicks.append(self.context.config.botnet[_].nick) + return botnicks + ################################################################################################ + @irc3.event(irc3.rfc.JOIN) + def welcome(self,mask,channel,**kw): + self.bot=self.context + if not self.bot.nick in _botnicks: + if self.bot.nick in self.getbotnicks(): + _botnicks.append(self.bot.nick) + self.context.privmsg(channel,f'+++ networked +++') + self.context.privmsg(channel,(f"bot {len(_botnicks)} of {len(self.getbotnames())-1} online")) + if len(_botnicks) == len(self.getbotnames())-1: + self.bot.k=KRYLON(self.context,channel) + self.context.privmsg(channel,f'[ BOTNET ONLINE ]') + ################################################################################################ + @irc3.event(irc3.rfc.CONNECTED) + def connected(self,**kw): + self.context.join(self.channel) + ################################################################################################ + @irc3.event(rfc.PRIVMSG,iotype="out") + def krylon_event(self,mask=None,event=None,target=None,data=None): + global _botlok + global _botops + global _botrot + global _botlok + global _botlvl + global _duffer + bot=self + nick=bot.context.nick + channel=bot.channel + nick=self.context.nick + channel=self.channel + if _botlok==1: + if _botops[_botrot]==nick and data.strip() ==_duffer[_botrot].strip() and _botlvl==0: + _botlvl=1 + ################################################################################################ + @irc3.event(irc3.rfc.PRIVMSG,iotype="in") + def on_privmsg(self,mask=None,data=None,**kw): + global _botlok + global _botops + global _botrot + global _botlok + global _botlvl + global _duffer + bot=self + nick=mask.nick + channel=bot.channel + if _botlok==1: + if _botops[_botrot]==nick and data.strip() == _duffer[_botrot].strip() and _botlvl==1: + _botlvl=0 + _botrot+=1 + botnames=list(self.context.config.botnet.keys()) + for i,_ in enumerate(botnames): + if self.context.config.botnet[_].nick == _botops[_botrot]: + self.context.config.botnet[_].privmsg(channel,_duffer[_botrot]) + if _botrot>=len(_duffer): + _botlok=0 + _botrot=0 + _botlvl=0 + _botops=[] + _duffer=[] +#################################################################################################### +@cron('* * * * * */1') +def krylon_event_system(self): + global _botlok + global _botops + global _botrot + global _botlok + global _botlvl + global _duffer + target="#tcpdirect" + if len(self.duffer) > 0 and _botlok==0: + _duffer=self.duffer + _botops=[] + _botrot=0 + _botlok=1 + _botlvl=0 + n=0 + for _ in _duffer: + _botops.append(_botnicks[n]) + n+=1 + if n >= len(_botnicks): + n=0 + botnames=list(self.config.botnet.keys()) + for i,_ in enumerate(botnames): + if self.config.botnet[_].nick == _botops[_botrot]: + self.config.botnet[_].privmsg(target,_duffer[_botrot]) +#################################################################################################### \ No newline at end of file diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..4fc6c4e --- /dev/null +++ b/run.sh @@ -0,0 +1,130 @@ +INIT=0 +CONFIG=".krylon_config"; #[ -f $CONFIG ] && rm $CONFIG +[ -f $CONFIG ] && INIT=1 +MEMORY="" + +kset() { + if [[ -z $1 ]] || [[ -z $2 ]]; then echo "error: no variable or value to kset()"; exit; fi + echo "$1 = $2" >> $CONFIG +} +kwrite() { + if [[ -z $1 ]]; then echo "error: no value to kwrite()"; exit; fi + echo "$1" >> $CONFIG +} +kblank() { + echo "" >> $CONFIG +} + +kprompt() { + if [[ -z $1 ]] || [[ -z $2 ]] || [[ -z $3 ]] || [[ -z $4 ]] || [[ -z $5 ]] || [[ -z $6 ]]; then echo "error: no variable, prompt, help, enforcement, type or memory passed to kprompt()"; exit; fi + local INIVAR=$1; local PROMPT=$2; local HALPLZ=$3; local ENFORCE=$4; local TYPE=$5; local MEMORIZE=$6; unset REPLY; + while [[ -z "${REPLY}" ]] || [[ $ENFORCE -eq 1 ]]; do + echo -en "$HALPLZ\n$PROMPT"; [ $ENFORCE -eq 0 ] && echo -n ": " || echo -n "[y/n]: " + read; + if [[ $ENFORCE -eq 1 ]] && [[ $TYPE -eq 0 ]]; then + while ! [[ -z $ENFORCE ]]; do + if ([ ${REPLY} == "y" ] || [ ${REPLY} == "Y" ]); then + return 0 + elif ([ ${REPLY} == "n" ] || [ ${REPLY} == "N" ]); then + return 9 + else + echo -n "$HALPLZ\n$PROMPT"; [ $ENFORCE -eq 0 ] && echo -n ": " || echo -n "[y/n]: " + read; + fi; + done; + elif [[ $TYPE -eq 1 ]]; then + while true; do + [[ ${REPLY} =~ ^-?[0-9]+$ ]] + if ! [ $? -eq 0 ]; then + echo -n "$HALPLZ\n$PROMPT"; [ $ENFORCE -eq 0 ] && echo -n ": " || echo -n "[y/n]: " + read; + else + return ${REPLY} + fi + done; + fi; + done; + + if [ $MEMORIZE -eq 1 ]; then + MEMORY=${REPLY} + fi; + + [ $TYPE -eq 1 ] && return ${REPLY} || kset "$INIVAR" "${REPLY}" + + return 0; +} + +if [ $INIT -eq 0 ]; then + kwrite "[bot]" + kprompt "nick" "bot ircnick" "bot's nickname to use on the network. e.g. here!*@*" 0 0 1 + BOTNICK=$(python -c "import random; print(''.join(random.sample('$MEMORY',len('$MEMORY'))))"); + kprompt "username" "bot username" "bot's username to use on the network. e.g. *!here@*" 0 0 1 + USERNAME=$(python -c "import random; print(''.join(random.sample('$MEMORY',len('$MEMORY'))))"); + kprompt "realname" "bot realname" "bot's realname that shows if someone. /whois bot." 0 0 0 + kprompt "host" "irc address" "the ip/hostname of the irc server this bot will connect to." 0 0 0 + kprompt "port" "irc port" "the port number of the irc server this bot will connect to." 0 0 0 + kprompt "channel" "irc channel" "the channel the bot(s) will join upon connection." 0 0 1 + CHANNEL=$MEMORY; + kwrite "version=1" + kprompt "ssl" "use ssl?" "is the connect to this irc server using secure socket layers?" 1 0 0 + [ $? -eq 0 ] && (kset "ssl" "true"; kset "ssl_verify" "cert_none") || (kset "ssl" "false") + kprompt "bots" "how many helper bots?[0-255]" "how many bots will connect to the ircserver?" 0 1 0 + BOTCOUNT=$?; + kblank + kwrite "includes =" + kwrite " irc3.plugins.command" + kwrite " irc3.plugins.asynchronious" + kwrite " irc3.plugins.storage" + kwrite " irc3.plugins.uptime" + kwrite " irc3.plugins.ctcp" + kwrite " irc3.plugins.cron" + kwrite " irc3.plugins.logger" + kwrite " irc3.plugins.userlist" + kwrite " plugins.b33p" + kwrite " plugins.krylon" + kblank + kwrite "flood_burst = 0" + kwrite "flood_rate = 1" + kwrite "flood_rate_delay = 1" + kwrite "storage = json://.krylon_database" + kblank + kwrite "[irc3.plugins.command]" + kwrite "cmd = ?" + kwrite "guard = irc3.plugins.command.mask_based_policy" + kblank + kwrite "[irc3.plugins.command.masks]" + kwrite "d"'!'"*dr1p@* = all_permissions" + kwrite "* = view" + kblank + kwrite "ignore_list =" + kwrite " g1mp_"'!'"*@*" + kwrite " g1mp"'!'"*@*" + kwrite " ken_"'!'"*@*" + kwrite " ken"'!'"*@*" + kblank + for i in $(seq 1 $BOTCOUNT); do + kwrite "[bot_$i]" + RANDOM=$((1 + $RANDOM % 255)) + SALT=$(printf '%x\n' $RANDOM) + THIS=$SALT"_krylon_$(printf '%x\n' $i)" + THAT=$(python -c "import random; print(''.join(random.sample('$THIS',len('$THIS'))))"); + kwrite "nick = $THAT" + RANDOM=$((1 + $RANDOM % 255)) + SALT=$(printf '%x\n' $RANDOM) + THIS=$SALT"$USERNAME" + THAT=$(python -c "import random; print(''.join(random.sample('$THIS',len('$THIS'))))"); + kwrite "username = $THAT" + kwrite "channel = $CHANNEL" + kblank + done; +fi; + +echo -e "\n-\n" + +[ -f $CONFIG ] && cat $CONFIG + +echo -e "\n-\nEXECUTING" + +irc3 $CONFIG + +exit diff --git a/screenshots/s.jpg b/screenshots/s.jpg new file mode 100755 index 0000000..2f7a167 Binary files /dev/null and b/screenshots/s.jpg differ diff --git a/screenshots/s1.png b/screenshots/s1.png new file mode 100644 index 0000000..320a71b Binary files /dev/null and b/screenshots/s1.png differ diff --git a/screenshots/s2.png b/screenshots/s2.png new file mode 100644 index 0000000..431ad98 Binary files /dev/null and b/screenshots/s2.png differ