
import os
import psycopg2
import struct
import time
import msg as MSG
from flask import Flask
from flask import request


conn = psycopg2.connect(database="mg_master",
	host="localhost",
	user="postgres",
	password="y0l0sw4gm8yeet",
	port="5432")

cursor = conn.cursor()

webserv = Flask(__name__)

class RegisteredServer:
	id = ""
	time_registered = 0
	def __init__(self, new_id):
		self.id = new_id
		self.time_registered = time.time()
registered_servers = {}

def read_securitybytes(msg):
	# security bytes, really just a stupid check
	# to see if someone is trying to poke us
	if (MSG.ReadByte(msg) != 4):
		return "security byte 0 incorrect"
	if (MSG.ReadByte(msg) != 8):
		return "security byte 1 incorrect"
	if (MSG.ReadByte(msg) != 15):
		return "security byte 2 incorrect"
	if (MSG.ReadByte(msg) != 16):
		return "security byte 3 incorrect"
	if (MSG.ReadByte(msg) != 23):
		return "security byte 4 incorrect"
	if (MSG.ReadByte(msg) != 42):
		return "security byte 5 incorrect"
	
	# check server authentication key
	server_key = MSG.ReadString(msg)
	if (server_key not in registered_servers):
		cursor.execute("SELECT id FROM gameservers WHERE authkey = '" + server_key + "'")
		output = cursor.fetchone()
		if (output == None):
			return "invalid server authkey"
		registered_servers[server_key] = RegisteredServer(server_key)
	else:
		server = registered_servers[server_key]
		if (time.time() > (server.time_registered + 3)):
			cursor.execute("SELECT id FROM gameservers WHERE authkey = '" + server_key + "'")
			output = cursor.fetchone()
			if (output == None):
				return "server authkey timeout, no longer valid"
		server.time_registered = time.time()
	
	return True

def packet_nop():
	pass

def packet_getrating(msg):
	flags = MSG.ReadByte(msg)
	uid = MSG.ReadString(msg)
	pname = MSG.ReadString(msg)
	player_id = -1
	rating = -1

	uid_field = "uid"
	if (flags & 0x02):
		uid_field = "guid"

	cursor.execute("SELECT player_id FROM players WHERE " + uid_field + " = '" + uid + "'")
	output = cursor.fetchone()

	if (output == None):
		if (flags & 0x01):
			print("generating new player for " + pname + "(" + uid + ")")
			cursor.execute("INSERT INTO players (" + uid_field + ", display_name) VALUES ('" + uid + "', '" + pname + "')")
		else:
			MSG.WriteInt16(MSG.msg_reply, int(-1))
			return
	else:
		player_id = int(output[0])
	
	cursor.execute("UPDATE players SET last_played = CURRENT_TIMESTAMP where " + uid_field + " = '" + uid + "'") # update last played time

	cursor.execute("SELECT rating FROM players WHERE " + uid_field + " = '" + uid + "'")
	rating = int(cursor.fetchone()[0])

	cursor.execute("SELECT display_name FROM players WHERE " + uid_field + " = '" + uid + "'")
	pname = str(cursor.fetchone()[0])

	conn.commit()
	MSG.WriteInt16(MSG.msg_reply, rating)
	
	if (rating > 0):
		MSG.WriteInt64(MSG.msg_reply, player_id)
		MSG.WriteString(MSG.msg_reply, pname)

packet_read = [packet_nop, packet_getrating]
def process_messages(msg):
	MSG.msg_reply = bytearray()

	check = read_securitybytes(msg)
	if (check != True):
		MSG.WriteByte(MSG.msg_reply, 0)
		MSG.WriteString(MSG.msg_reply, check)
		return MSG.msg_reply

	
	MSG.WriteByte(MSG.msg_reply, 1) # success

	while (len(msg) > 0):
		type = MSG.ReadByte(msg)
		packet_read[type](msg)

	return MSG.msg_reply


@webserv.route("/rating", methods=["POST", "GET"])
def rating():
	if request.method == 'GET':
		return b'1'
	elif request.method == 'POST':
		print(request.data)
		if (request.mimetype == "application/octet-stream"):
			return process_messages(bytearray(request.data))

