diff --git a/Editor/textfiles.db b/Editor/textfiles.db index 98bdf12..ed529a4 100644 Binary files a/Editor/textfiles.db and b/Editor/textfiles.db differ diff --git a/Logogame/images/alienswarm.png b/Logogame/images/alienswarm.png new file mode 100644 index 0000000..f2c1e01 Binary files /dev/null and b/Logogame/images/alienswarm.png differ diff --git a/Logogame/images/chaos.png b/Logogame/images/chaos.png new file mode 100644 index 0000000..b5c645b Binary files /dev/null and b/Logogame/images/chaos.png differ diff --git a/Logogame/images/fomalhaut.png b/Logogame/images/fomalhaut.png new file mode 100644 index 0000000..ed32490 Binary files /dev/null and b/Logogame/images/fomalhaut.png differ diff --git a/Logogame/images/gearbox.png b/Logogame/images/gearbox.png new file mode 100644 index 0000000..4de5408 Binary files /dev/null and b/Logogame/images/gearbox.png differ diff --git a/Logogame/logogame.py b/Logogame/logogame.py new file mode 100644 index 0000000..623196a --- /dev/null +++ b/Logogame/logogame.py @@ -0,0 +1,398 @@ +import os +import tkinter +import sqlite3 +import hashlib +import string +from PIL import Image +from PIL import ImageTk + +class Generic: + def __init__(self): + pass + def set_dict_attributes(self, attributes): + for attribute in attributes: + setattr(self, attribute, attributes[attribute]) + +class LogoGame: + def __init__(self): + self.WINDOWS_BADCHARS = '\\/?:*"><|' + self.t = tkinter.Tk() + self.t.title('Logogame') + if not os.path.exists('logos.db'): + print('You\'re missing the game\'s logo database!') + print('Cannot proceed!') + quit() + + self.font_main = ('Consolas', 12) + self.font_small = ('Consolas', 8) + self.color_blue = '#0ed' + self.color_green = '#31f13a' + self.color_red = '#e23939' + + self.logos_per_row = 6 + self.logo_padx = 10 + self.logo_pady = 10 + + self.dbindex_id = 0 + self.dbindex_name = 1 + self.dbindex_solutions = 2 + self.dbindex_images = 3 + self.dbindex_tag = 4 + + self.sql = sqlite3.connect('logos.db') + self.cur = self.sql.cursor() + self.stats_main = self.stats_load('stats') + self.playerstats_load(self.stats_main.playername) + + self.tkinter_elements = [] + self.logo_elements = [] + self.tag_elements = [] + self.active_tags = set() + self.all_tags = [] + self.all_logos = [] + self.logos_load() + + self.w = 1062 + self.h = 600 + self.screenwidth = self.t.winfo_screenwidth() + self.screenheight = self.t.winfo_screenheight() + self.windowwidth = self.w + self.windowheight = self.h + self.windowx = (self.screenwidth-self.windowwidth) / 2 + self.windowy = ((self.screenheight-self.windowheight) / 2) - 27 + self.geometrystring = '%dx%d+%d+%d' % (self.windowwidth, self.windowheight, self.windowx, self.windowy) + self.t.geometry(self.geometrystring) + + + #self.t.bind('', self.update_wh) + + def start(self): + self.gui_build_main() + self.t.mainloop() + + def logos_load(self): + self.all_logos = [] + self.cur.execute('SELECT * FROM logos') + fetch = self.cur.fetchall() + for item in fetch: + logo = Generic() + logo.id = item[self.dbindex_id] + logo.images = item[self.dbindex_images].split(',') + logo.name = item[self.dbindex_name] + logo.solutions = item[self.dbindex_solutions].split(',') + logo.tags = item[self.dbindex_tag].split(',') + logo.solved = self.playerstats_gethassolved(logo.id) + self.all_logos.append(logo) + self.all_tags = self.get_all_tags() + self.all_tags.append('Completed') + + def destroy_all_elements(self): + self.tag_elements = [] + self.destroy_all_logos() + while len(self.tkinter_elements) > 0: + self.tkinter_elements[0].destroy() + del self.tkinter_elements[0] + + def destroy_all_logos(self): + while len(self.logo_elements) > 0: + self.logo_elements[0].destroy() + del self.logo_elements[0] + + def gui_build_main(self, *b): + self.destroy_all_elements() + ### + self.frame_mainmenu = tkinter.Frame(self.t) + self.frame_mainmenu.pack(expand=True, anchor='center') + self.tkinter_elements.append(self.frame_mainmenu) + # + self.button_playgame = tkinter.Button( + self.frame_mainmenu, + text='Play', + #relief='flat', + font=self.font_main, + bg=self.color_green, + activebackground=self.color_green, + command=self.gui_build_game) + self.button_playgame.grid(row=10, column=5) + self.tkinter_elements.append(self.button_playgame) + # + self.label_playername = tkinter.Label( + self.frame_mainmenu, + text='Player name: ', + font=self.font_main) + self.label_playername.grid(row=30, column=4) + self.tkinter_elements.append(self.label_playername) + # + self.entry_playername = tkinter.Entry( + self.frame_mainmenu, + font=self.font_main, + relief='solid', + width=30) + self.entry_playername.bind('', lambda x: self.playername_set(self.entry_playername.get())) + self.entry_playername.insert(0, self.stats_main.playername) + self.entry_playername.grid(row=30, column=5) + self.tkinter_elements.append(self.entry_playername) + # + self.button_playername = tkinter.Button( + self.frame_mainmenu, + text='Set', + font=self.font_small, + #relief='flat', + bg=self.color_blue, + activebackground=self.color_blue, + command=lambda: self.playername_set(self.entry_playername.get())) + self.button_playername.grid(row=30, column=6) + self.tkinter_elements.append(self.button_playername) + # + self.label_playerhash = tkinter.Label( + self.frame_mainmenu, + text=self.sha8(self.stats_main.playername), + font=self.font_main) + self.label_playerhash.grid(row=30, column=7) + self.tkinter_elements.append(self.label_playerhash) + ### + + def gui_build_game(self, *b): + self.destroy_all_elements() + ### + self.frame_gametoolbar = tkinter.Frame(self.t) + self.frame_gametoolbar.pack(fill='x', anchor='n') + self.tkinter_elements.append(self.frame_gametoolbar) + # + self.button_back = tkinter.Button( + self.frame_gametoolbar, + text='X', + font=self.font_main, + bg=self.color_red, + activebackground=self.color_red, + command=self.gui_build_main) + self.button_back.grid(row=0, column=0) + self.tkinter_elements.append(self.button_back) + # + #self.frame_gamearea = tkinter.Frame(self.t, bg='#f00') + #self.frame_gamearea.pack(expand=True, fill='both', anchor='w') + # + self.frame_posttoolbar = tkinter.Frame(self.t) + self.frame_posttoolbar.pack(expand=True, fill='both') + self.tkinter_elements.append(self.frame_posttoolbar) + # + self.frame_gametaglist = tkinter.Frame(self.frame_posttoolbar) + self.frame_gametaglist.pack(expand=True, fill='y', side='left', anchor='w') + self.tkinter_elements.append(self.frame_gametaglist) + # + self.frame_logoarea = tkinter.Frame(self.frame_posttoolbar) + self.frame_logoarea.pack(expand=True, fill='both', anchor='e') + self.tkinter_elements.append(self.frame_logoarea) + # + button_applytag = tkinter.Button(self.frame_gametaglist, text='Apply', command=self.gui_rebuild_game) + button_applytag.grid(row=0, column=0, sticky='w') + # + for i in range(len(self.all_tags)): + tag = self.all_tags[i] + intvar = tkinter.IntVar() + intvar.tag=tag + checkbox = tkinter.Checkbutton(self.frame_gametaglist, text=tag, variable=intvar) + checkbox.intvar = intvar + checkbox.grid(row=i+1, column=0, sticky='w') + intvar.set(1) + self.tkinter_elements.append(checkbox) + self.tag_elements.append(checkbox) + self.active_tags.add(tag) + + self.gui_rebuild_game() + + ### + + def gui_rebuild_game(self, *b): + self.destroy_all_logos() + w = self.t.winfo_width() + h = self.t.winfo_height() + resizemeter = w / 9 + row = 0 + col = 0 + for element in self.tag_elements: + if element.intvar.get() == 1: + self.active_tags.add(element.intvar.tag) + elif element.intvar.tag in self.active_tags: + self.active_tags.remove(element.intvar.tag) + + for logo in self.all_logos: + if not any(tag in self.active_tags for tag in logo.tags): + continue + if logo.solved is True and 'Completed' not in self.active_tags: + continue + logoframe = tkinter.Frame(self.frame_logoarea) + logoframe.pack_propagate(0) + self.logo_elements.append(logoframe) + imageframe = tkinter.Frame(logoframe, width=resizemeter, height=resizemeter) + imageframe.pack_propagate(0) + imageframe.grid(row=0, column=0, sticky='n') + label_image = tkinter.Label(imageframe) + label_image.pack(anchor='center', expand=True, fill='both') + label_name = tkinter.Label(logoframe) + entry_name = tkinter.Entry(logoframe, justify='center') + if logo.solved is True: + i = self.png_load(logo.images[-1], resizemeter) + label_image.configure(image=i) + label_image.i = i + label_name.configure(text=logo.name) + label_name.grid(row=1, column=0, sticky='s') + else: + i = self.png_load(logo.images[0], resizemeter) + label_image.configure(image=i) + label_image.i = i + entry_name.logo = logo + entry_name.grid(row=1, column=0, sticky='s') + entry_name.bind('', self.solve) + self.tkinter_elements.append(logoframe) + logoframe.id = logo.id + logoframe.entry_name = entry_name + logoframe.label_name = label_name + logoframe.label_image = label_image + logoframe.grid(row=row, column=col, padx=self.logo_padx, pady=self.logo_pady) + col += 1 + col = col % self.logos_per_row + if col == 0: + row += 1 + + + def gui_build_logo(self, *b): + self.destroy_all_elements() + ### + + def solve(self, event): + guess = event.widget.get() + guess = guess.lower() + solutions = event.widget.logo.solutions + if any(solution.lower() == guess for solution in solutions): + event.widget.configure(state='disabled') + self.playerstats_sethassolved(event.widget.logo.id) + event.widget.logo.solved = True + + def playername_set(self, newname): + if newname == '': + return + if newname != self.stats_main.playername: + self.cur.execute('UPDATE stats SET value=? WHERE key="playername"', [newname]) + self.sql.commit() + playerhash = self.playerstats_load(newname) + self.stats_main.playername = newname + + if self.label_playerhash: + self.label_playerhash.configure(text=playerhash) + for logo in self.all_logos: + logo.solved = self.playerstats_hassolved(logo.id) + print('Name: ' + self.stats_main.playername) + self.clean_empty_dbs() + + def sha8(self, text): + sha = hashlib.sha256() + sha.update(text.encode('utf-8')) + sha = sha.hexdigest() + return sha[:8] + + def png_load(self, filename, resize=None): + if filename[-4:] != '.png': + filename = filename + '.png' + filename = 'images/' + filename + i = Image.open(filename) + if resize: + ratio = resize / max(i.size) + newx = int(i.size[0] * ratio) + newy = int(i.size[1] * ratio) + i = i.resize([newx, newy], resample=Image.ANTIALIAS) + #i = i.resize([newx, newy]) + i = ImageTk.PhotoImage(i) + return i + + def stats_load(self, database): + if database == 'stats': + self.cur.execute('SELECT * FROM stats') + fetchall = self.cur.fetchall() + if database == 'player': + self.cur_player.execute('SELECT * FROM stats') + fetchall = self.cur_player.fetchall() + keyvals = {} + for fetched in fetchall: + keyvals[fetched[0]] = fetched[1] + stats = Generic() + stats.set_dict_attributes(keyvals) + return stats + + def playerstats_load(self, playername, presha=False): + if not presha: + sha = self.sha8(playername) + else: + sha = playername + filename = self.strip_to_filename(playername) + '_' + sha + self.sql_player = sqlite3.connect('playerdata/%s.db' % filename) + self.cur_player = self.sql_player.cursor() + self.cur_player.execute('CREATE TABLE IF NOT EXISTS stats(key TEXT, value TEXT)') + self.sql_player.commit() + return sha + + def playerstats_set(self, key, value): + self.cur_player.execute('SELECT * FROM stats WHERE key=?', [key]) + if self.cur_player.fetchone(): + self.cur_player.execute('UPDATE stats SET value=? WHERE key=?', [value, key]) + else: + self.cur_player.execute('INSERT INTO stats VALUES(?, ?)', [key, value]) + self.sql_player.commit() + + def playerstats_get(self, key): + self.cur_player.execute('SELECT * FROM stats WHERE key=?', [key]) + f = self.cur_player.fetchone() + if f: + return f[1] + return None + + def playerstats_gethassolved(self, logoid): + key = 'hassolved_%d' % logoid + val = self.playerstats_get(key) + if val in [None, 0, False, '0']: + return False + return True + + def playerstats_sethassolved(self, logoid): + key = 'hassolved_%d' % logoid + val = 1 + self.playerstats_set(key, val) + + def strip_to_filename(self, s): + for badchar in self.WINDOWS_BADCHARS: + s = s.replace(badchar, '') + return s + + def get_all_tags(self): + self.cur.execute('SELECT * FROM logos') + fetch = self.cur.fetchall() + alltags = [] + for item in fetch: + itemtags = item[self.dbindex_tag] + itemtags = itemtags.replace(', ', ',') + itemtags = itemtags.split(',') + alltags += itemtags + alltags = list(set(alltags)) + alltags.sort() + return alltags + + def clean_empty_dbs(self): + ls = os.listdir('playerdata') + todelete = [] + for name in ls: + name = 'playerdata/'+name + s = sqlite3.connect(name) + c = s.cursor() + c.execute('SELECT * FROM stats') + if not c.fetchone(): + del c + del s + try: + os.remove(name) + except PermissionError: + pass + + +if __name__ == '__main__': + logogame = LogoGame() + logogame.start() \ No newline at end of file diff --git a/Logogame/logos.db b/Logogame/logos.db index 8e10e2e..12ff17f 100644 Binary files a/Logogame/logos.db and b/Logogame/logos.db differ diff --git a/Logogame/playerdata/test_9f86d081.db b/Logogame/playerdata/test_9f86d081.db new file mode 100644 index 0000000..85d247a Binary files /dev/null and b/Logogame/playerdata/test_9f86d081.db differ diff --git a/Trash/rssc.py b/Trash/rssc.py new file mode 100644 index 0000000..29cdf65 --- /dev/null +++ b/Trash/rssc.py @@ -0,0 +1,68 @@ +import urllib.request + +URL_BASIC = 'http://socialclub.rockstargames.com/' +URL_USER = 'http://socialclub.rockstargames.com/member/reddragon' +URL_SIGNIN = "https://socialclub.rockstargames.com/profile/signincompact" +HTML_KEYBREAK = 'input name="__RequestVerificationToken" type="hidden" value="' +KEY_USERNAME = 'login' +KEY_PASSWORD = 'password' +KEY_REMEMBERME = 'rememberme' +KEY_TOKEN = '__RequestVerificationToken' + + +USERNAME = 'ctU8BYeD' +PASSWORD = 'ctU8BYeD' +USERAGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36' +REFERER = 'http://socialclub.rockstargames.com/member/' +CONTENTTYPE = 'application/x-www-form-urlencoded' +HOST = 'socialclub.rockstargames.com' +ORIGIN = 'http://socialclub.rockstargames.com' +ACCEPT = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' +ENCODING = 'gzip, deflate' + +def prepare_request(url, method='GET', cookies=None): + request = urllib.request.Request(url, method=method) + + request.headers['User-Agent'] = USERAGENT + request.headers['Accept'] = ACCEPT + request.headers['Referer'] = REFERER + request.headers['Content-Type'] = CONTENTTYPE + request.headers['Host'] = HOST + request.headers['Origin'] = ORIGIN + #request.headers['Accept-Encoding'] = ENCODING + if cookies: + request.headers['Cookie'] = cookies + request.headers['Connection'] = 'keep-alive' + return request + +def login(): + basic = prepare_request(URL_BASIC) + basic = urllib.request.urlopen(basic) + cookies = str(basic.headers) + cookies = cookies.split('\n') + cookies = [h for h in cookies if 'Set-Cookie' in h] + cookies = ';'.join([h.split(': ')[1] for h in cookies]) + print(cookies) + basic = basic.read() + basic = basic.decode('utf-8', 'ignore') + basic = basic.split(HTML_KEYBREAK)[1] + token = basic.split('"')[0] + del basic + print(token) + + log = prepare_request(URL_SIGNIN, method='POST', cookies=cookies) + log.data = '' + log.data += '%s=%s&' % (KEY_USERNAME, USERNAME) + log.data += '%s=%s&' % (KEY_PASSWORD, PASSWORD) + log.data += '%s=%s&' % (KEY_TOKEN, token) + log.data += '%s=true' % (KEY_REMEMBERME) + log.data = log.data.encode('utf-8') + + results = urllib.request.urlopen(log) + print(results.status) + print(dir(results)) + print(results.headers) + print(results.read()) + + +login()