archive

- Random tools & helpful resources for IRC
git clone git://git.acid.vegas/archive.git
Log | Files | Refs | Archive

commit e987568dc9730f88a025c328a692b1dad1d2d663
parent 509bc44d86b9cb57e9a3ab18b905ead9800a5548
Author: acidvegas <acid.vegas@acid.vegas>
Date: Sat, 22 Jul 2023 15:32:25 -0400

added tailbot for syn cause gh0st is a skid still

Diffstat:
Abots/tailbot.py | 143+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1 file changed, 143 insertions(+), 0 deletions(-)

diff --git a/bots/tailbot.py b/bots/tailbot.py
@@ -0,0 +1,143 @@
+#!/usr/bin/env python
+# Tail Bot for syn (cause fuck gh0st and his skid scripts) - Developed by acidvegas in Python (https://git.acid.vegas/archive)
+
+'''
+WOAH LOOK NO 3RD PARTY LIBRARIES
+WOW NO USELESS FUNCTIONS JUST THAT PASS AND ARE DECLARED FOR NO REASON
+WOW SIMPLE CODE WRITTEN THE CORRECT WAY
+'''
+
+import asyncio
+import pathlib
+import ssl
+import time
+import urllib.request
+
+class connection:
+	server  = 'irc.supernets.org'
+	port    = 6697
+	ipv6    = False
+	ssl     = True
+	vhost   = None
+	channel = '#honeypot'
+	key     = None
+	modes   = None
+
+class identity:
+	nickname = 'TailBot'
+	username = 'tail'
+	realname = 'gh0st is a skid LOL'
+	nickserv = None
+
+FIFO_PATH = pathlib.Path('HPOT_FIFO')
+
+def color(msg, foreground, background=None):
+	return f'\x03{foreground},{background}{msg}{reset}' if background else f'\x03{foreground}{msg}{reset}'
+
+def debug(data):
+	print('{0} | [~] - {1}'.format(time.strftime('%I:%M:%S'), data))
+
+def error(data, reason=None):
+	print('{0} | [!] - {1} ({2})'.format(time.strftime('%I:%M:%S'), data, str(reason))) if reason else print('{0} | [!] - {1}'.format(time.strftime('%I:%M:%S'), data))
+
+def ssl_ctx():
+	ctx = ssl.create_default_context()
+	ctx.check_hostname = False
+	ctx.verify_mode = ssl.CERT_NONE
+	return ctx
+
+class Bot():
+	def __init__(self):
+		self.last            = 0
+		self.loops           = dict()
+		self.slow            = False
+		self.reader          = None
+		self.writer          = None
+
+	async def raw(self, data):
+		self.writer.write(data[:510].encode('utf-8') + b'\r\n')
+		await self.writer.drain()
+
+	async def sendmsg(self, target, msg):
+		await self.raw(f'PRIVMSG {target} :{msg}')
+
+	async def irc_error(self, chan, msg, reason=None):
+		await self.sendmsg(chan, '[{0}] {1} {2}'.format(color('ERROR', red), msg, color(f'({reason})', grey))) if reason else await self.sendmsg(chan, '[{0}] {1}'.format(color('ERROR', red), msg))
+
+	async def loop_tail(self):
+		if not os.path.exists(FIFO_PATH)
+			os.mkfifo(FIFO_PATH)
+		while True:
+			with open(FIFO_PATH) as fifo:
+				while True:
+					try:
+						self.sendmsg(connection.channel, FIFO_PATH.read_text())
+					except Exception as ex:
+						try:
+							self.irc_error(connection.channel, 'Error occured in the loop_tail function!', ex)
+						except:
+							error('Fatal error occured in the loop_tail functions!', ex)
+
+	async def connect(self):
+		while True:
+			try:
+				options = {
+					'host'       : connection.server,
+					'port'       : connection.port,
+					'limit'      : 1024,
+					'ssl'        : ssl_ctx() if connection.ssl else None,
+					'family'     : 10 if connection.ipv6 else 2,
+					'local_addr' : connection.vhost
+				}
+				self.reader, self.writer = await asyncio.wait_for(asyncio.open_connection(**options), 15)
+				await self.raw(f'USER {identity.username} 0 * :{identity.realname}')
+				await self.raw('NICK ' + identity.nickname)
+			except Exception as ex:
+				error('failed to connect to ' + connection.server, ex)
+			else:
+				await self.listen()
+			finally:
+				self.loops   = dict()
+				await asyncio.sleep(30)
+
+	async def listen(self):
+		while True:
+			try:
+				if self.reader.at_eof():
+					break
+				data = await asyncio.wait_for(self.reader.readuntil(b'\r\n'), 60)
+				line = data.decode('utf-8').strip()
+				args = line.split()
+				debug(line)
+				if line.startswith('ERROR :Closing Link:'):
+					raise Exception('Connection has closed.')
+				elif args[0] == 'PING':
+					await self.raw('PONG '+args[1][1:])
+				elif args[1] == '001':
+					if connection.modes:
+						await self.raw(f'MODE {identity.nickname} +{connection.modes}')
+					if identity.nickserv:
+						await self.sendmsg('NickServ', f'IDENTIFY {identity.nickname} {identity.nickserv}')
+					if identity.operator:
+						await self.raw('OPER hates {identity.operator}')
+					await self.raw(f'JOIN {connection.channel} {connection.key}') if connection.key else await self.raw('JOIN ' + connection.channel)
+					self.loops['tail'] = asyncio.create_task(self.loop_tail())
+				elif args[1] == '433':
+					error('The bot is already running or nick is in use.')
+			except (UnicodeDecodeError, UnicodeEncodeError):
+				pass
+			except Exception as ex:
+				error('fatal error occured', ex)
+				break
+			finally:
+				self.last = time.time()
+
+# Main
+print('#'*56)
+print('#{:^54}#'.format(''))
+print('#{:^54}#'.format('Tail IRC Bot (for syn)'))
+print('#{:^54}#'.format('Developed by acidvegas in Python (without 3rd party libraries cause im not a skid like gh0st)'))
+print('#{:^54}#'.format('https://git.acid.vegas/archive (fuck twistednet supernets wanna-be)'))
+print('#{:^54}#'.format(''))
+print('#'*56)
+asyncio.run(Bot().connect())