update v3.01

This commit is contained in:
.[d]. 2022-04-10 13:32:46 -05:00
parent 875d96d16e
commit fa8aad1364
8 changed files with 594 additions and 0 deletions

192
README.md Normal file
View File

@ -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
```

19
plugins/b33p.py Normal file
View File

@ -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 <dubstep>...
"""
robostep='{}: b00p'.format(mask.nick)
roooboot = ''.join(args['<dubstep>'])
if roooboot == self.bot.nick:
self.bot.privmsg(target,robostep)

100
plugins/fifo.py Normal file
View File

@ -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)
################################################################################################

153
plugins/krylon.py Normal file
View File

@ -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])
####################################################################################################

130
run.sh Executable file
View File

@ -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

BIN
screenshots/s.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

BIN
screenshots/s1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

BIN
screenshots/s2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB