ansi depumper plugin

This commit is contained in:
.[d]. 2022-11-23 13:28:31 +00:00
parent 8e5ebc11f6
commit 0ac14554d7

View File

@ -0,0 +1,742 @@
# -*- coding: utf-8 -*- ########################################################################################### SOF
"""# 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 ####
#### ###MMMNs- `.. `/-. `+dMMMMMM ####
#### ###Ny: ./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 #"""
import os
import re
import subprocess
from datetime import datetime
import irc3
import requests
from irc3.plugins.command import command
from irc3.plugins.cron import cron
from plugins.tool_guds_plugin import guds
#######################################################################################################################
global REASSEMBLY
global iCount
REASSEMBLY="1B5B306D"
iCount=-1
REGEX = re.compile("\x03(?:\d{1,2}(?:,\d{1,2})?)?",re.UNICODE)
DEBUGGING = False
ANSI_HOME='databases/ansi'
if not os.path.exists(ANSI_HOME):
os.mkdir(ANSI_HOME)
COLOR_SET_A = "\x1b[38;2;196;0;255m"
COLOR_SET_B = "\x1b[38;2;128;64;255m"
COLOR_SET_C = "\x1b[38;2;128;0;255m"
COLOR_SET_D = "\x1b[2;35m"
COLOR_SET_E = "\x1b[2;31m"
#######################################################################################################################
############
@irc3.plugin
############ ##########################################################################################################
############# #########################################################################################################
class Plugin:
#############
########################### #######################################################################################
class HYDRA_FILE_HANDLER():
###########################
###################
def __init__(self):
###################
self.txt=[]
self.ans=[]
self.png=[]
self.ptr=[]
########################### #######################################################################################
class DR1P_STATE_MACHINE():
###########################
FLAGS = ['ESCAPED']
###################
def __init__(self):
###################
self.ESCAPED = False
self.ASSEMBLY = False
self.bseq = []
self.interrupt = 0
self.stack = []
self.attr_bright = False
self.attr_fg = 0
self.attr_bg = 0
self.attr_last = False
self.attr_reset = False
#################
def fog(self, s):
#################
if DEBUGGING:
print(s)
##################
def flip(self, b):
##################
FLIP = ({'03': '1B5B'})
fog = self.fog
if b in FLIP:
fog(f'flp:{b}>{FLIP[b]}')
return FLIP[b]
else:
return b
#################
def seq(self, b):
#################
global REASSEMBLY
fog = self.fog
fog(f'\033[38;2;0;255;0mseq:{b}')
if b == "1B5B":
self.ack(flag="ESCAPED")
REASSEMBLY += str(b)
self.ASSEMBLY = False
self.stack = []
if self.interrupt:
if DEBUGGING: fog(f'\033[38;2;255;0;0minterrupted')
if int("30", 16) <= int(str(b), 16) <= int("39", 16):
if DEBUGGING: fog('\n\033[38;2;255;255;255m<<< <<< BINGO - CODES >>> >>>\x1b[\x1b[92m')
self.stack.append(b)
if DEBUGGING:
fog('')
elif b == "2C":
if DEBUGGING: fog('\n\033[38;2;0;255;255m<<< <<< BINGO - DELIMITER >>> >>>\x1b[\x1b[92m')
self.stack.append(b)
if DEBUGGING: fog('')
else:
if self.interrupt == True and len(self.stack) >= 1:
if not b == "1B" or not int("30", 16) <= int(str(b), 16) <= int("39", 16) or not b == "2C":
self.ack(flag="ESCAPED")
color_table = [ 1, 5, 3, 7, 2, 6, 10, 15,
14, 4, 9, 8, 12, 13, 11, 0 ]
try:
REVERT = bytes([int(x, 16)
for x in self.stack]).decode()
if ',' in REVERT:
A = REVERT.split(',')[0]
B = '2C'
C = REVERT.split(',')[1]
AA = color_table.index(int(A))
if int(A) > 7:
self.attr_bright = True
REASSEMBLY += "313B"
CC = color_table.index(int(C))
if AA > 7 or CC > 7:
if self.attr_bright:
AA -= 8
A = ''
C = ''
for _ in range(len(str(AA))):
A += "33" + \
hex(int(str(AA)[_]) +
0x30)[2:].zfill(2).upper()
for _ in range(len(str(CC))):
C += "34" + \
hex(int(str(CC)[_]) +
0x30)[2:].zfill(2).upper()
REASSEMBLY += A
REASSEMBLY += "3B"
REASSEMBLY += C
else:
A = ''
AA = color_table.index(int(REVERT))
if AA > 7:
AA -= 8
if not self.attr_bright:
REASSEMBLY += "313B"
self.attr_bright = True
for _ in range(len(str(AA))):
A += "33" + \
hex(int(str(AA)[_]) +
0x30)[2:].zfill(2).upper()
REASSEMBLY += A
REASSEMBLY += "6D"
self.stack = []
self.ASSEMBLY = True
except:
self.ASSEMBLY = False
if DEBUGGING:
fog('')
if self.ASSEMBLY:
self.stack.append(b)
REASSEMBLY += b
self.bseq.append(b)
if len(self.bseq) == 1:
if REASSEMBLY == "1B5B306D":
REASSEMBLY += b
if b == "0A":
if REASSEMBLY.endswith('0A'):
REASSEMBLY = REASSEMBLY[:-2]
if REASSEMBLY.endswith('0D'):
REASSEMBLY = REASSEMBLY[:-2]
while REASSEMBLY.endswith('20'):
REASSEMBLY = REASSEMBLY[:-2]
REASSEMBLY += "1B5B306D0D0A"
return
###############################
def ack(self, flag="", cmd=""):
###############################
fog = self.fog
if cmd == "escaped":
if flag == "ESCAPED":
return 1
else:
return 0
if not flag:
for i, _ in enumerate(self.FLAGS):
if eval(f"self.{self.FLAGS[i]}"):
if DEBUGGING:
fog(f'\033[38;2;0;0;255m{_} FLAG IS {str(eval(f"self.{self.FLAGS[i]}")).upper()}')
else:
if flag in self.FLAGS:
if flag == "ESCAPED":
self.ESCAPED = not self.ESCAPED
if DEBUGGING:
fog(f"ESCAPED flag set {self.ESCAPED}")
if self.ESCAPED:
self.interrupt = 1
else:
self.interrupt = 0
#################
def fmt(self, b):
#################
b = hex(int(b, 16))[2:].upper().zfill(2)
return b
#################
def asm(self, b):
#################
b = self.fmt(b)
b = self.flip(b)
self.seq(b)
##################
def push(self, b):
##################
fog = self.fog
global iCount
iCount += 1
fog = self.fog
if DEBUGGING: fog(f'{COLOR_SET_B}{str(iCount).zfill(8)} {hex(iCount)[2:].zfill(8).upper()}{COLOR_SET_A}')
asm = self.asm
self.ack()
asm(b)
########################### #######################################################################################
##################################### #############################################################################
class ESCAPE_CODE_DETECTION_SYSTEM():
#####################################
###################
def __init__(self):
###################
self.REGEX=re.compile("\x03(?:\d{1,2}(?:,\d{1,2})?)?",re.UNICODE)
self.cycle = 0
self.count = 0
self.lastcount =- 1
self.sorted = []
self.sorting = []
self.buffering = False
INDEX = 0
FILE_PREFIX = "bounce__irc_codes_"
self.STRINCREMENT = f"{str(INDEX)}".zfill(8)
self.FILENAME = f"{ANSI_HOME}/{FILE_PREFIX}{self.STRINCREMENT}.txt"
while os.path.exists(self.FILENAME):
INDEX += 1
self.STRINCREMENT = f"{str(INDEX)}".zfill(8)
self.FILENAME = f"{ANSI_HOME}/{FILE_PREFIX}{self.STRINCREMENT}.txt"
self.f1 = open(self.FILENAME, "w") # file handle f1
#################################################
def push(self,nick,channel,dataline,hexdataline):
#################################################
if not self.buffering:
self.sorting.append([nick,True,channel,[datetime.now().timestamp()],[dataline],[hexdataline]])
self.sorting[0][3].pop()
self.sorting[0][4].pop()
self.sorting[0][5].pop()
self.buffering = True
try:
for x in self.sorting:
if x[0]==nick:
if x[1]:
x[3].append(datetime.now().timestamp())
x[4].append(dataline)
x[5].append(hexdataline)
except Exception as e:
pass
##################################### #############################################################################
######################## ##########################################################################################
def __init__(self, bot):
########################
self.bot = bot
self.bot.hfh = self.HYDRA_FILE_HANDLER()
self.bot.ecds = self.ESCAPE_CODE_DETECTION_SYSTEM()
globals()['guds'].memories.append([self.HYDRA_FILE_HANDLER,'net_krylon_plugin:__init__.HYDRA_FILE_HANDLER(HFH)'])
globals()['guds'].memories.append([self.ESCAPE_CODE_DETECTION_SYSTEM,'net_krylon_plugin:__init__.ESCAPE_CODE_DETECTION_SYSTEM(ECDS)'])
globals()['guds'].memories.append([self.bot,'net_krylon_plugin:__init__.self'])
self.processing_byte=[]
self.processing_command=[]
self.DELIMIT=False
self.hexdataline=None
############
@irc3.extend
###################### ######################################################################################### find every instance of a string within a string
def depumper_reset(self):
######################
self.bot.hfh = guds.memory('HYDRA_FILE_HANDLER')()
self.bot.ecds = guds.memory('ESCAPE_CODE_DETECTION_SYSTEM')()
self.processing_byte=[]
self.processing_command=[]
self.DELIMIT=False
self.hexdataline=None
global REASSEMBLY
global iCount
REASSEMBLY="1B5B306D"
iCount=-1
############
@irc3.extend
###################### ######################################################################################### find every instance of a string within a string
def findall(self,s,w):
######################
result=[i for i in range(len(s)) if s.startswith(w, i)]
#############
return result
#############
############
@irc3.extend
####################### ######################################################################################## used to strip a string of escape codes
def stripcodes(self,s):
#######################
codes=[]
buffer=s
escapes=self.findall(s,'\x1b')
commands=self.findall(s,'m')
if not len(escapes)==len(commands):
for i,_ in enumerate(commands):
try:
int(commands[i])
except:
commands.pop(i)
if len(escapes)==len(commands):
for i in range(len(escapes)):
codes.append(s[escapes[i]:commands[i]+1])
for _ in codes:
buffer=buffer.replace(_,'')
#############
return buffer
#############
############
@irc3.extend
################################################################################################################ used to make sure a string fits into a space
def padding(self,s,n):
######################
pad=n-len(self.stripcodes(s))
padding=(" "*pad)
s+=padding
########
return s
########
############
@irc3.extend
############################ ######################################################################################
def process_irc_codes(self,ecds):
############################
# self.bot = self
self.ecds = ecds
dsm=self.DR1P_STATE_MACHINE()
if not guds.memory('DR1P_STATE_MACHINEE'):
globals()['guds'].memories.append([dsm,'net_krylon_plugin:__new__.DR1P_STATE_MACHINE(DSM)'])
for i in range(0,len(self.ecds.l)):
#########################
# REQUIRES MOTION FROM CRONJOB
#########################
DYTE=hex(self.ecds.l[i])[2:].zfill(2).upper()
DINT=hex(self.ecds.l[i])
self.processing_byte.append(DYTE)
dsm.push(DINT)
if DYTE=='03':
self.processing_command.append(f'{COLOR_SET_B}>> {self.padding("^ESCAPE CODE:",10)} 1B{COLOR_SET_D}')
elif DYTE=='0A':
self.processing_command.append(f'{COLOR_SET_B}>> {self.padding("ENTER NEWLINE",10)} {COLOR_SET_D}')
elif 0x30 <= self.ecds.l[i] <= 0x39:
b=1; dytes=[hex(self.ecds.l[i])[2:].zfill(2).upper()]
if 0x30 <= self.ecds.l[i+1] <= 0x39:
b+=1
dytes.append(f'{hex(self.ecds.l[i+1])[2:].zfill(2).upper()}')
LAYER='None'
if b==1:
if hex(self.ecds.l[i])[2:].zfill(2).upper()=='2C':
LAYER='FG COLOR'
elif hex(self.ecds.l[i])[2:].zfill(2).upper()=='03':
LAYER='FG COLOR'
if 0x30 <= self.ecds.l[i-1] <= 0x39:
b-=1; dytes=""; LAYER=""
if dytes or LAYER:
if self.DELIMIT:
self.DELIMIT=False; LAYER="BG COLOR"
else:
LAYER="FG COLOR"
self.processing_command.append(f'{COLOR_SET_C}>> {b} {self.padding("CODE BYTES:",11)} {dytes} - {LAYER}{COLOR_SET_E}')
else:
self.processing_command.append(f"{COLOR_SET_C}>> {self.padding('- CODE BYTES:',11)} ['{DYTE}']")
if b==2:
if hex(self.ecds.l[i+2])[2:].zfill(2).upper()=='2C':
LAYER='FG COLOR'
else:
LAYER='BG COLOR'
if hex(self.ecds.l[i-1])[2:].zfill(2).upper()=='03' or hex(self.ecds.l[i-1])[2:].zfill(2).upper()=='2C':
self.processing_command.append(f'{COLOR_SET_C}>> {b} {self.padding("CODE BYTES:",11)} {dytes} - {LAYER}{COLOR_SET_D}')
else:
self.processing_command.append(f'{COLOR_SET_A}>> {b} {self.padding("CODE BYTES:",11)} {dytes} - {LAYER}')
# if DEBUGGING:
# return self.ecds.l
elif DYTE=='2C':
self.processing_command.append(f"{COLOR_SET_B}>> {self.padding('CODE DELIMIT:',11)} ['3B']")
self.DELIMIT=True
else:
self.processing_command.append(f'{COLOR_SET_E}..')
if DEBUGGING: print(f'{">"*64} [ {len(REASSEMBLY)} CHARS - {len(REASSEMBLY)//2} BYTES ] {REASSEMBLY}')
#####################
return self.ecds.l
#####################
#############################
@irc3.event(irc3.rfc.PRIVMSG)
########################################################################## ########################################
def on_privmsg(self, mask=None, event=None, target=None, data=None, **kw):
##########################################################################
if mask.nick == self.bot.nick: return
self.hexdataline = ''
inverse = self.bot.ecds.REGEX.sub("", data)
if inverse != data:
for c in data:
self.hexdataline += hex(ord(c))[2:].upper()
self.bot.ecds.push(mask.nick, target, data, self.hexdataline)
################################################################################################################### DMZ
# DMZ #################################################################################################################
################################################################################################################### DMZ
######################
@cron('* * * * * */1')
###################### ################################################################################################
###################### ################################################################################################
def ecds_cronjob(bot):
######################
ecds = bot.ecds
##############################
if bot.ecds.buffering == True:
##############################
ecds.cycle += 1
for z, entry in enumerate(ecds.sorting):
if entry[1]:
distances = []
timestamps = entry[3]
ecds.lastcount = ecds.count
ecds.count = len(timestamps)
if ecds.count != ecds.lastcount: return
timestamps.reverse()
for i in range(0, len(timestamps)-1):
distance = timestamps[i]-timestamps[i+1]
distances.append(distance)
longest_distance = max(distances)
timestamp = datetime.now().timestamp()
active_distance = timestamp-timestamps[0]
if active_distance > longest_distance*2.0:
ecds.sorting[z][1] = False
nick = ecds.sorting[z][0]
channel = ecds.sorting[z][2]
ecds.sorted.append([nick, channel, entry[4], entry[5]])
ecds.sorting.remove(ecds.sorting[z])
ecds_sorted = ecds.sorted[-1]
for dataline in ecds_sorted[2]:
ecds.f1.write(f"{dataline}\n") # file handle f1
# bot.privmsg(hydrachan,dataline)
########################
SELF_DISABLE_FLAG = True
########################
try:
for ecds_sorting in ecds.sorting:
for isnotdisabled in ecds_sorting[1]:
if isnotdisabled:
#########################
SELF_DISABLE_FLAG = False
#########################
except:
pass
#####################
if SELF_DISABLE_FLAG:
#####################
msg = f'<<< ________ansi_plugin >>> [ event: control code buffer ]'
msg += ' - '
msg += 'finished, disabling cleanup cronjob'
print(msg)
ecds.buffering = False
bot.ecds.f1.close() # file handle f1
print('\x1b[36m'+''*16+'\n\x1b[32mDEPUMPER █\n'+''*16)
try:
ecds.IN__FILE__UTF8_IRC_ARTWORK_TXT = ecds.FILENAME
ecds.OUT_FILE_CP437_ANS_ARTWORK_BIN = ecds.IN__FILE__UTF8_IRC_ARTWORK_TXT+".ans"
ecds.f2 = open(ecds.IN__FILE__UTF8_IRC_ARTWORK_TXT, "rb") # file handle f2
ecds.l = ecds.f2.read() # file handle f2
ecds.f2.close() # file handle f2
except:
print('\n\x1b[31mERROR: NO INPUT BUFFER/FILE')
try:
if DEBUGGING:
print(chr(27)+"[2J")
print(f'\x1b[36mPROCESSING: {ecds.IN__FILE__UTF8_IRC_ARTWORK_TXT}')
#################################
#################################printhex(main(DR1P_STATE_MACHINE))
#################################
bot.process_irc_codes(ecds)
#################################
#################################
#################################
irc_bytes = []
for i in range(len(REASSEMBLY)//2):
irc_bytes.append(int(REASSEMBLY[i*2:i*2+2], 16))
bot.ecds.f3 = open(bot.ecds.OUT_FILE_CP437_ANS_ARTWORK_BIN, 'wb') # file handle f3
bad_byte_seq = [226, 150, 172]
good_byte_seq = []
rebuilt_bytes = []
baseptr = 0
try:
FOUND = [ (i, i+len(bad_byte_seq)) for i in range(len(irc_bytes)) if irc_bytes[i:i+len(bad_byte_seq)] == bad_byte_seq ]
for offset in FOUND:
good_byte_seq.append([x for x in irc_bytes[baseptr:offset[0]]])
good_byte_seq.append([95])
baseptr = offset[1]
good_byte_seq.append(irc_bytes[baseptr:])
for _ in good_byte_seq:
try:
for __ in _:
rebuilt_bytes.append(__)
except:
pass
irc_bytes = rebuilt_bytes
except Exception as e:
print(f"error: pre-codec-conversion: {e}")
try:
irc_bytes = bytes(irc_bytes).decode().encode('cp437')
bot.ecds.f3.write(irc_bytes) # file handle f3
except Exception as e:
print(f"error: post-codec-conversion: {e}")
bot.ecds.f3.close() # file handle f3
MSG=f'\x1b[32mSUCCESS:\n'
MSG+=f'\x1b[35mIN < PROCESSED: {bot.ecds.IN__FILE__UTF8_IRC_ARTWORK_TXT}\n'
MSG+=f'\x1b[35mOUT > RENDERED: {bot.ecds.OUT_FILE_CP437_ANS_ARTWORK_BIN}'
print(MSG)
###########################################################
if os.path.exists(bot.ecds.OUT_FILE_CP437_ANS_ARTWORK_BIN):
###########################################################
fin = bot.ecds.OUT_FILE_CP437_ANS_ARTWORK_BIN
fout = fin+".png"
print('\x1b[36m'+''*16 +'\n\x1b[32mANSILOVE █\n'+''*16)
lines = REGEX.sub('', bot.stripcodes(bot.ecds.l.decode())).splitlines()
columns = (sum([len(x) for x in lines])//len(lines)//1)+1
subprocess.call(["ansilove", "-r", fin, "-c", str(columns)])
########################
if os.path.exists(fout):
########################
###############
OK_FLAG = False
###############
files = {'upload': open(fin+".png", 'rb'), }
response = requests.post("https://tcp.ac/i/put", files=files, auth=('tcpac', 'kuevEacshmej5'))
for _ in response.text.split(',')[0].split('"'):
if 'https://tcp.ac/i/' in _:
bot.ecds.url_tcpac = _
OK_FLAG = True
###########
if OK_FLAG:
###########
MSG = f'\x02\x0302{bot.ecds.sorted[-1][0]} \x0F\x1D'
MSG+= f'\x02\x0303\x1D\x1Fansilove \x0F\x1D\x0F\x1D'
MSG+= f'\x0F\x02\x0312{bot.ecds.url_tcpac} \x0F\x1D'
MSG=bot.emo(MSG)
bot.privmsg(bot.ecds.sorted[-1][1], MSG)
print('\x1b[36m'+''*16 +'\n\x1b[32mREPUMPED █\n'+''*16)
try: bot.ecds.f1.close()
except: print('error: f1 already closed')
try: bot.ecds.f2.close()
except: print('error: f2 already closed')
try: bot.ecds.f3.close()
except: print('error: f3 already closed')
except Exception as e:
print(f'\x1b[31mFAILURE: {e}')
###########################################################
###########################################################
del bot.ecds;
bot.ecds = guds.memory('ESCAPE_CODE_DETECTION_SYSTEM')()
bot.depumper_reset()
###########################################################
###########################################################
################################################################################################################### EOF
"""# MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmyydMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh- .sNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN+' '+NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM/ .NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. yMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. oMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNMMMMMMMMM ####
#### MMMMMd/.''''''..-/+shmMMMMMMMMMMMMMMMMMMMh .NMMMMMMMMMMMMMMMMMMmhs+:-'' ':dMMMMM ####
#### MMMh: '+mMMMMMMMMMMMMMMMh' -NMMMMMMMMMMMMMMNs. :hMMM ####
#### MN/ -omMMMMMMMMMMN+ .hMMMMMMMMMMmy: +MM ####
#### MMMdo. ./sdNMMMNs' :hMMMNds/. :yN### ####
#### MMMMMMd+' .-/' ..' -sNMMM### ####
#### MMMMMMMMNs- '+dMMMMMMMMM ####
#### MMMMMMMMMMMh: -. .. 'oNMMMMMMMMMMM ####
#### MMMMMMMMMMMMMd: '+dmho. .odNdo. 'sNMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMh. '+dm+' ':/:' '-//. .smo- oNMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMs .:+s/' ./+:.' 'MMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMd -MMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMys+/-' .:+oshMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMds: .+hNMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMN. oMMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMM. '-/-' yMMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMN .mNMMMMMNmy sMMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMs ': sMMMMMMMMMM: - :MMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMM. 'oNN. .NMMMMMMMMMMm' md: dMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMs 'oNMMMh' hMMMMMMMMMMMMs +MMMd/ -MMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMd' :yMMMMMMMy' oMMMMMMMMMMMMMM- :MMMMMMmo. +MMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMN/smMMMMMMMMMMd' -MMMMMMMMMMMMMMMs +MMMMMMMMMMd+sMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMm- -MMMMMMMMMMMMMMMy 'yMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN+ mMMMMMMMMMMMMMMo /mMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMshMMMMMMMMMMMMMM+hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ####
#### MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM #"""