239 lignes
18 KiB
Python
239 lignes
18 KiB
Python
motd = """
|
|
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
|
|
"""
|
|
|
|
import sys
|
|
import re
|
|
from urllib.request import Request, urlopen
|
|
from urllib.error import URLError, HTTPError
|
|
import ipdb
|
|
|
|
# color conversion lut, say html'd as "</span> │ <span class="ef196">⣧⠃ " or control coded for curl as \x1b[38;5;196. both are same valuees
|
|
# 196 is what i see, so roll through the lut, 196 is 52 which is hex so its really int of 82.. what that means is #ff0000, red af. the bottom
|
|
# graph is red, 196 for whatever terminal stuff, ff0000 for whatever css/markup interpreter but on irc its out side the 16 base colors, the
|
|
# chart for 16-98 color codes will reflect this. https://modern.ircdocs.horse/formatting.html.. 196 == 52 == ff0000 == red as fuck. now the
|
|
# problem is there are more diverse colors used then what we have available through irc so rather then be lazy an color blind you want the
|
|
# closest color to within the options we have. so that is the point of all the lut/gravity. .[d].
|
|
|
|
# terminal color vs irc color
|
|
rgb2irc = { 52: '16', 94: '17', 100: '18', 58: '19', 22: '20', 29: '21', 23: '22', 24: '23', 17: '24', 54: '25', 53: '26', 89: '27',
|
|
88: '28', 130: '29', 142: '30', 64: '31', 28: '32', 35: '33', 30: '34', 25: '35', 18: '36', 91: '37', 90: '38', 125: '39',
|
|
124: '40', 166: '41', 184: '42', 106: '43', 34: '44', 49: '45', 37: '46', 33: '47', 19: '48', 129: '49', 127: '50', 161: '51',
|
|
196: '52', 208: '53', 226: '54', 154: '55', 46: '56', 86: '57', 51: '58', 75: '59', 21: '60', 171: '61', 201: '62', 198: '63',
|
|
203: '64', 215: '65', 227: '66', 191: '67', 83: '68', 122: '69', 87: '70', 111: '71', 63: '72', 177: '73', 207: '74', 205: '75',
|
|
217: '76', 223: '77', 229: '78', 193: '79', 157: '80', 158: '81', 159: '82', 153: '83', 147: '84', 183: '85', 219: '86', 212: '87',
|
|
16: '88', 233: '89', 235: '90', 237: '91', 239: '92', 241: '93', 244: '94', 247: '95', 250: '96', 254: '97', 231: '98', }
|
|
|
|
# same terminal color vs rgb values
|
|
set2rgb = { 52: '#470000', 94: '#472100', 100: '#474700', 58: '#324700', 22: '#004700', 29: '#00472C', 23: '#004747', 24: '#002747', 17: '#000047', 54: '#2E0047', 53: '#470047', 89: '#47002A',
|
|
88: '#740000', 130: '#743A00', 142: '#747400', 64: '#517400', 28: '#007400', 35: '#007449', 30: '#007474', 25: '#004074', 18: '#000074', 91: '#4B0074', 90: '#740074', 125: '#740045',
|
|
124: '#B50000', 166: '#B56300', 184: '#B5B500', 106: '#7DB500', 34: '#00B500', 49: '#00B571', 37: '#00B5B5', 33: '#0063B5', 19: '#0000B5', 129: '#7500B5', 127: '#B500B5', 161: '#B5006B',
|
|
196: '#FF0000', 208: '#FF8C00', 226: '#FFFF00', 154: '#B2FF00', 46: '#00FF00', 86: '#00FFA0', 51: '#00FFFF', 75: '#008CFF', 21: '#0000FF', 171: '#A500FF', 201: '#FF00FF', 198: '#FF0098',
|
|
203: '#FF5959', 215: '#FFB459', 227: '#FFFF71', 191: '#CFFF60', 83: '#6FFF6F', 122: '#65FFC9', 87: '#6DFFFF', 111: '#59B4FF', 63: '#5959FF', 177: '#C459FF', 207: '#FF66FF', 205: '#FF59BC',
|
|
217: '#FF9C9C', 223: '#FFD39C', 229: '#FFFF9C', 193: '#E2FF9C', 157: '#9CFF9C', 158: '#9CFFDB', 159: '#9CFFFF', 153: '#9CD3FF', 147: '#9CD3FF', 183: '#DC9CFF', 219: '#FF9CFF', 212: '#FF94D3',
|
|
16: '#000000', 233: '#131313', 235: '#282828', 237: '#363636', 239: '#4D4D4D', 241: '#656565', 244: '#818181', 247: '#9F9F9F', 250: '#BCBCBC', 254: '#E2E2E2', 231: '#FFFFFF', }
|
|
|
|
# the color system used by the grapher, also the rgb values to coincide. now can reverse their color codes to ansi color codes to irc color codes, just gotta find colors
|
|
# close enough now so that its not some puke ass colors looking like some 70s show.
|
|
rgb2set = { "ef0": "#000000", "ef1": "#CD0000", "ef2": "#00CD00", "ef3": "#CDCD00", "ef4": "#0000EE", "ef5": "#CD00CD", "ef6": "#00CDCD", "ef7": "#E5E5E5",
|
|
"ef8": "#7F7F7F", "ef9": "#FF0000", "ef10": "#00FF00", "ef11": "#FFFF00", "ef12": "#5C5CFF", "ef13": "#FF00FF", "ef14": "#00FFFF", "ef15": "#FFFFFF",
|
|
"eb8": "#7F7F7F", "eb9": "#FF0000", "eb10": "#00FF00", "eb11": "#FFFF00", "eb12": "#5C5CFF", "eb13": "#FF00FF", "eb14": "#00FFFF", "eb15": "#FFFFFF", "ef16": "#000000",
|
|
"ef17": "#00005f", "ef18": "#000087", "ef19": "#0000af", "ef20": "#0000d7", "ef21": "#0000ff", "ef22": "#005f00", "ef23": "#005f5f", "ef24": "#005f87", "ef25": "#005faf",
|
|
"ef26": "#005fd7", "ef27": "#005fff", "ef28": "#008700", "ef29": "#00875f", "ef30": "#008787", "ef31": "#0087af", "ef32": "#0087d7", "ef33": "#0087ff", "ef34": "#00af00",
|
|
"ef35": "#00af5f", "ef36": "#00af87", "ef37": "#00afaf", "ef38": "#00afd7", "ef39": "#00afff", "ef40": "#00d700", "ef41": "#00d75f", "ef42": "#00d787", "ef43": "#00d7af",
|
|
"ef44": "#00d7d7", "ef45": "#00d7ff", "ef46": "#00ff00", "ef47": "#00ff5f", "ef48": "#00ff87", "ef49": "#00ffaf", "ef50": "#00ffd7", "ef51": "#00ffff", "ef52": "#5f0000",
|
|
"ef53": "#5f005f", "ef54": "#5f0087", "ef55": "#5f00af", "ef56": "#5f00d7", "ef57": "#5f00ff", "ef58": "#5f5f00", "ef59": "#5f5f5f", "ef60": "#5f5f87", "ef61": "#5f5faf",
|
|
"ef62": "#5f5fd7", "ef63": "#5f5fff", "ef64": "#5f8700", "ef65": "#5f875f", "ef66": "#5f8787", "ef67": "#5f87af", "ef68": "#5f87d7", "ef69": "#5f87ff", "ef70": "#5faf00",
|
|
"ef71": "#5faf5f", "ef72": "#5faf87", "ef73": "#5fafaf", "ef74": "#5fafd7", "ef75": "#5fafff", "ef76": "#5fd700", "ef77": "#5fd75f", "ef78": "#5fd787", "ef79": "#5fd7af",
|
|
"ef80": "#5fd7d7", "ef81": "#5fd7ff", "ef82": "#5fff00", "ef83": "#5fff5f", "ef84": "#5fff87", "ef85": "#5fffaf", "ef86": "#5fffd7", "ef87": "#5fffff", "ef88": "#870000",
|
|
"ef89": "#87005f", "ef90": "#870087", "ef91": "#8700af", "ef92": "#8700d7", "ef93": "#8700ff", "ef94": "#875f00", "ef95": "#875f5f", "ef96": "#875f87", "ef97": "#875faf",
|
|
"ef98": "#875fd7", "ef99": "#875fff", "ef100": "#878700", "ef101": "#87875f", "ef102": "#878787", "ef103": "#8787af", "ef104": "#8787d7", "ef105": "#8787ff", "ef106": "#87af00",
|
|
"ef107": "#87af5f", "ef108": "#87af87", "ef109": "#87afaf", "ef110": "#87afd7", "ef111": "#87afff", "ef112": "#87d700", "ef113": "#87d75f", "ef114": "#87d787", "ef115": "#87d7af",
|
|
"ef116": "#87d7d7", "ef117": "#87d7ff", "ef118": "#87ff00", "ef119": "#87ff5f", "ef120": "#87ff87", "ef121": "#87ffaf", "ef122": "#87ffd7", "ef123": "#87ffff", "ef124": "#af0000",
|
|
"ef125": "#af005f", "ef126": "#af0087", "ef127": "#af00af", "ef128": "#af00d7", "ef129": "#af00ff", "ef130": "#af5f00", "ef131": "#af5f5f", "ef132": "#af5f87", "ef133": "#af5faf",
|
|
"ef134": "#af5fd7", "ef135": "#af5fff", "ef136": "#af8700", "ef137": "#af875f", "ef138": "#af8787", "ef139": "#af87af", "ef140": "#af87d7", "ef141": "#af87ff", "ef142": "#afaf00",
|
|
"ef143": "#afaf5f", "ef144": "#afaf87", "ef145": "#afafaf", "ef146": "#afafd7", "ef147": "#afafff", "ef148": "#afd700", "ef149": "#afd75f", "ef150": "#afd787", "ef151": "#afd7af",
|
|
"ef152": "#afd7d7", "ef153": "#afd7ff", "ef154": "#afff00", "ef155": "#afff5f", "ef156": "#afff87", "ef157": "#afffaf", "ef158": "#afffd7", "ef159": "#afffff", "ef160": "#d70000",
|
|
"ef161": "#d7005f", "ef162": "#d70087", "ef163": "#d700af", "ef164": "#d700d7", "ef165": "#d700ff", "ef166": "#d75f00", "ef167": "#d75f5f", "ef168": "#d75f87", "ef169": "#d75faf",
|
|
"ef170": "#d75fd7", "ef171": "#d75fff", "ef172": "#d78700", "ef173": "#d7875f", "ef174": "#d78787", "ef175": "#d787af", "ef176": "#d787d7", "ef177": "#d787ff", "ef178": "#d7af00",
|
|
"ef179": "#d7af5f", "ef180": "#d7af87", "ef181": "#d7afaf", "ef182": "#d7afd7", "ef183": "#d7afff", "ef184": "#d7d700", "ef185": "#d7d75f", "ef186": "#d7d787", "ef187": "#d7d7af",
|
|
"ef188": "#d7d7d7", "ef189": "#d7d7ff", "ef190": "#d7ff00", "ef191": "#d7ff5f", "ef192": "#d7ff87", "ef193": "#d7ffaf", "ef194": "#d7ffd7", "ef195": "#d7ffff", "ef196": "#ff0000",
|
|
"ef197": "#ff005f", "ef198": "#ff0087", "ef199": "#ff00af", "ef200": "#ff00d7", "ef201": "#ff00ff", "ef202": "#ff5f00", "ef203": "#ff5f5f", "ef204": "#ff5f87", "ef205": "#ff5faf",
|
|
"ef206": "#ff5fd7", "ef207": "#ff5fff", "ef208": "#ff8700", "ef209": "#ff875f", "ef210": "#ff8787", "ef211": "#ff87af", "ef212": "#ff87d7", "ef213": "#ff87ff", "ef214": "#ffaf00",
|
|
"ef215": "#ffaf5f", "ef216": "#ffaf87", "ef217": "#ffafaf", "ef218": "#ffafd7", "ef219": "#ffafff", "ef220": "#ffd700", "ef221": "#ffd75f", "ef222": "#ffd787", "ef223": "#ffd7af",
|
|
"ef224": "#ffd7d7", "ef225": "#ffd7ff", "ef226": "#ffff00", "ef227": "#ffff5f", "ef228": "#ffff87", "ef229": "#ffffaf", "ef230": "#ffffd7", "ef231": "#ffffff", "ef232": "#080808",
|
|
"ef233": "#121212", "ef234": "#1c1c1c", "ef235": "#262626", "ef236": "#303030", "ef237": "#3a3a3a", "ef238": "#444444", "ef239": "#4e4e4e", "ef240": "#585858", "ef241": "#626262",
|
|
"ef242": "#6c6c6c", "ef243": "#767676", "ef244": "#808080", "ef245": "#8a8a8a", "ef246": "#949494", "ef247": "#9e9e9e", "ef248": "#a8a8a8", "ef249": "#b2b2b2", "ef250": "#bcbcbc",
|
|
"ef251": "#c6c6c6", "ef252": "#d0d0d0", "ef253": "#dadada", "ef254": "#e4e4e4", "ef255": "#eeeeee", }
|
|
|
|
twobitgfx = { 226: 0, 214: 0, 220: 0, 208: 0, 202: 0, 196: 0, 190: 0, 154: 0, 118: 0, 82: 0, 51: 0, 50: 0, 49: 0, 48: 0, 47: 0, 46: 0, }
|
|
|
|
# fast value flipping for comparison
|
|
def invert_dict(d):
|
|
return {v: k for k, v in d.items()}
|
|
|
|
# index may be relative
|
|
def enumerate_dict(d):
|
|
return list(zip(list(d),list(invert_dict(d)),range(len(d))))
|
|
|
|
# to find values we wan to be closet too if not exact, well 1 number is easy.. 20 is close to 25.. but this rgb, there are 3 values..
|
|
# being close on one value means nothing if you are far off on others. so organize the values for r, then g and b and find the minimum
|
|
# per each and figure out the best average between the 3.. then, thats the color you want. 24bit is nice or whatever but only have
|
|
# inbetween colors.
|
|
def organize_dict(d):
|
|
_d=list(d.values())
|
|
return _d.sort()
|
|
|
|
def byte_range(s,x,y):
|
|
b=''
|
|
n=0
|
|
for _ in s[x:y]:
|
|
b += hex(ord(_))[2:]
|
|
n += 1
|
|
if n > 15:
|
|
b += '\n'
|
|
n = 0
|
|
return(b)
|
|
b = ''
|
|
else:
|
|
print(b)
|
|
|
|
def escape_ansi(line):
|
|
ansi_escape = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]')
|
|
return ansi_escape.sub('', str(line))
|
|
|
|
# rest.sx responds differently depending on your user-agent. it will respond with html code or control code.. browser vs curl uagent.
|
|
# this is why you see op1 and op2
|
|
USER_AGENT_BROWSER="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
|
|
USER_AGENT_CURL="curl/7.29.0"
|
|
STATUS_BAD_CODE=":( - error code: {}"
|
|
STATUS_BAD_REASON=":( - failed reason: {}"
|
|
STATUS_OK=":)"
|
|
|
|
# html response using browser uagent
|
|
def op1(commands):
|
|
url = f"https://rate.sx/{commands}"
|
|
r = Request(url,data=None,headers={ 'User-Agent': USER_AGENT_BROWSER })
|
|
try:
|
|
response = urlopen(r,timeout=10).read().decode('utf-8')
|
|
except HTTPError as e:
|
|
return STATUS_BAD_CODE.format(e.code)
|
|
except URLError as e:
|
|
return STATUS_BAD_REASON.format(e.reason)
|
|
else:
|
|
print(response)
|
|
return STATUS_OK + response
|
|
|
|
# controlcodes response using curl uagent, utf8
|
|
def op2(commands):
|
|
url = f"https://rate.sx/{commands}"
|
|
r = Request(url,data=None,headers={ 'User-Agent': USER_AGENT_CURL })
|
|
try:
|
|
response = urlopen(r,timeout=10).read().decode('utf-8')
|
|
except HTTPError as e:
|
|
return STATUS_BAD_CODE.format(e.code)
|
|
except URLError as e:
|
|
return STATUS_BAD_REASON.format(e.reason)
|
|
else:
|
|
print(response)
|
|
return STATUS_OK + response
|
|
|
|
# function that will determine closest color to choose
|
|
def hex2gravity(h):
|
|
r,g,b=int(h[1:3],16),int(h[3:5],16),int(h[5:7],16)
|
|
o=list(set2rgb.values()); o.sort()
|
|
R,G,B=[int(x[1:][0:2],16) for x in o],[int(x[1:][2:4],16) for x in o],[int(x[1:][4:6],16) for x in o]
|
|
_r = min(r,key=lambda x:abs(x-R))
|
|
_g = min(g,key=lambda x:abs(x-G))
|
|
_b = min(b,key=lambda x:abs(x-B))
|
|
|
|
# function popping out all the control codes and reinserting irc color codes instead. the lenghts may be different
|
|
# it could be out of alignment hence why im count bytes up front. im sure it will be a problem later.
|
|
def stage2(response):
|
|
g = response # site response
|
|
s = '' # buffer to snip
|
|
b = '' # buffer original copy
|
|
z = [] # data popped index
|
|
i = [] # offset of data popped index
|
|
d = [] # distance of data popped from each offset
|
|
n = [] # newline storage
|
|
|
|
for _ in g:
|
|
s = s + ''.join(_) # response joined to snip buffer
|
|
b = b + ''.join(_) # response joined to original backup buffer
|
|
try: # loop until error
|
|
B=escape_ansi(s).replace('\x1b(B','')
|
|
f = open('/run/irc3/tcpdirect','w')
|
|
for _ in B:
|
|
f.write(_)
|
|
f.close()
|
|
# y=0
|
|
# _n = 0
|
|
# n.append(0)
|
|
# while not _n == -1:
|
|
# #print(f"snip buffer length: {len(s)}")
|
|
# _n = s.find('\n',_n)
|
|
# if not _n == -1:
|
|
# print(_n)
|
|
# _n+=1
|
|
# n.append(_n)
|
|
# ipdb.set_trace()
|
|
# byte_range(s,n[-2],n[-1])
|
|
# else:
|
|
# break
|
|
# x = s.find('\x1b',y+1) # head of data to pop
|
|
# y = s.find('m') + 1 # tail of data to pop
|
|
# #ipdb.set_trace()
|
|
# if x == -1 or y == -1:
|
|
# break
|
|
# if len(s[x:y]) <= 1:
|
|
# ipdb.set_trace()
|
|
# z.append( s[x:y] ) # keep popping out data
|
|
# i.append( x ) # store the base offset of each control code
|
|
# d.append( x+y-1 ) # store the distance/length of control code to rebuild into aligment
|
|
# n.append(_n)
|
|
# print(s)
|
|
# #s = s[y:] # keep trimming snip buffer
|
|
except Exception as e: # error is ok, it means nothing to pop
|
|
print(f'potential error: {e}')
|
|
|
|
ipdb.set_trace()
|
|
|
|
|
|
# program entry point calling on mains
|
|
if __name__ == "__main__":
|
|
op1(sys.argv[1])
|
|
response=op2(sys.argv[1])
|
|
stage2(response[2:])
|
|
|