133 lines
3.5 KiB
Python
133 lines
3.5 KiB
Python
|
#!/usr/bin/env python3
|
||
|
# -*- coding: utf-8 -*-
|
||
|
"""
|
||
|
Created on Sun Jan 26 17:50:25 2020
|
||
|
|
||
|
@author: suwako
|
||
|
"""
|
||
|
|
||
|
import sys, multiprocessing, socket, time
|
||
|
if sys.platform == 'win32':
|
||
|
import multiprocessing.reduction
|
||
|
from colorama import Fore, Style
|
||
|
import numpy as np
|
||
|
|
||
|
|
||
|
def debug(*s): print("[D ] : " +
|
||
|
str(', '.join(map(str, s))) +
|
||
|
Style.RESET_ALL)
|
||
|
|
||
|
|
||
|
def info(*s): print(Fore.GREEN +
|
||
|
Fore.LIGHTGREEN_EX +
|
||
|
"[I -] : " +
|
||
|
Style.RESET_ALL +
|
||
|
str(', '.join(map(str, s))) +
|
||
|
Style.RESET_ALL)
|
||
|
|
||
|
|
||
|
def warn(*s): print(Fore.MAGENTA +
|
||
|
"[W ~] : " +
|
||
|
Style.RESET_ALL +
|
||
|
str(', '.join(map(str, s))) +
|
||
|
Style.RESET_ALL)
|
||
|
|
||
|
|
||
|
def error(*s): print(Fore.RED +
|
||
|
Fore.LIGHTRED_EX +
|
||
|
"[E !] : " +
|
||
|
Style.RESET_ALL +
|
||
|
str(', '.join(map(str, s))) +
|
||
|
Style.RESET_ALL)
|
||
|
|
||
|
level = 1
|
||
|
for i in range(level):
|
||
|
exec("debug info warn error".split()[i] + "= lambda *x: None")
|
||
|
class Satellite():
|
||
|
def __init__(self, pos=np.array([0., 0.]),
|
||
|
speed=np.array([0., 0.]),
|
||
|
mass=1):
|
||
|
self.pos = pos
|
||
|
self.speed = speed
|
||
|
self.mass = mass
|
||
|
self.G = 0.0000001
|
||
|
|
||
|
def tick(self):
|
||
|
self.pos += self.speed
|
||
|
|
||
|
def apply_gravity(self, elements):
|
||
|
for element in elements:
|
||
|
if element.pos != self.pos:
|
||
|
d = element.pos - self.pos
|
||
|
u = d/np.linalg.norm(d)
|
||
|
norm = self.G * element.mass * (d[0]**2 + d[1]**2)
|
||
|
self.speed += norm*u
|
||
|
|
||
|
|
||
|
class Player():
|
||
|
pass
|
||
|
|
||
|
|
||
|
class Map():
|
||
|
def __init__(self):
|
||
|
self.elements = []
|
||
|
|
||
|
|
||
|
def handle(connection, address):
|
||
|
try:
|
||
|
info("Connected at "+ ':'.join(map(str,address)))
|
||
|
while True:
|
||
|
data = connection.recv(1024)
|
||
|
if data == b"":
|
||
|
info("Socket closed remotely at " + ':'.join(map(str,address)))
|
||
|
break
|
||
|
debug("Received data %r" % data)
|
||
|
connection.sendall(data)
|
||
|
debug("Sent data")
|
||
|
except:
|
||
|
warn("Problem handling request")
|
||
|
connection.close()
|
||
|
raise
|
||
|
finally:
|
||
|
debug("Closing socket with " + ':'.join(map(str,address)))
|
||
|
connection.close()
|
||
|
|
||
|
class Server(object):
|
||
|
def __init__(self, hostname, port):
|
||
|
self.hostname = hostname
|
||
|
self.port = port
|
||
|
|
||
|
def start(self):
|
||
|
debug("listening")
|
||
|
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
|
self.socket.bind((self.hostname, self.port))
|
||
|
self.socket.listen(1)
|
||
|
|
||
|
while True:
|
||
|
conn, address = self.socket.accept()
|
||
|
process = multiprocessing.Process(target=handle,
|
||
|
args=(conn, address))
|
||
|
process.daemon = True
|
||
|
process.start()
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
server = Server("0.0.0.0", 9000)
|
||
|
try:
|
||
|
info("Listening")
|
||
|
server.start()
|
||
|
except:
|
||
|
error("Unexpected exception")
|
||
|
for process in multiprocessing.active_children():
|
||
|
info("Shutting down process %r", process)
|
||
|
process.terminate()
|
||
|
process.join()
|
||
|
raise
|
||
|
finally:
|
||
|
info("Shutting down")
|
||
|
for process in multiprocessing.active_children():
|
||
|
info("Shutting down process %r", process)
|
||
|
process.terminate()
|
||
|
process.join()
|
||
|
info("All done")
|