From d9895ec3f9d1f2e9347b83bf4b70c41e59ad750f Mon Sep 17 00:00:00 2001 From: PhilipTrauner Date: Sun, 25 Oct 2015 17:32:23 +0100 Subject: [PATCH] Initial commit --- .gitignore | 4 ++ .gitmodules | 6 ++ Link/__init__.py | 0 Server.py | 2 + Server/AsyncServer.py | 68 +++++++++++++++++++++ Server/Server.py | 47 +++++++++++++++ Server/__init__.py | 0 Sublime/fl0w/Default.sublime-commands | 6 ++ Sublime/fl0w/SublimeMenu.py | 85 +++++++++++++++++++++++++++ Sublime/fl0w/fl0w.py | 67 +++++++++++++++++++++ fl0w.py | 3 + 11 files changed, 288 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Link/__init__.py create mode 100644 Server.py create mode 100644 Server/AsyncServer.py create mode 100644 Server/Server.py create mode 100644 Server/__init__.py create mode 100644 Sublime/fl0w/Default.sublime-commands create mode 100644 Sublime/fl0w/SublimeMenu.py create mode 100644 Sublime/fl0w/fl0w.py create mode 100644 fl0w.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c1245f8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.DS_Store +*.pyc +__pycache__ + diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..495d440 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "Shared"] + path = Shared + url = git://github.com/PhilipTrauner/fl0w-Shared.git +[submodule "Sublime/fl0w/Shared"] + path = Sublime/fl0w/Shared + url = git://github.com/PhilipTrauner/fl0w-Shared.git diff --git a/Link/__init__.py b/Link/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Server.py b/Server.py new file mode 100644 index 0000000..3021b61 --- /dev/null +++ b/Server.py @@ -0,0 +1,2 @@ +import fl0w +import Server.Server diff --git a/Server/AsyncServer.py b/Server/AsyncServer.py new file mode 100644 index 0000000..1987051 --- /dev/null +++ b/Server/AsyncServer.py @@ -0,0 +1,68 @@ +from ESock import ESock +import DataTypes + +import socket +import _thread + + +class Server: + def __init__(self, host, port, handler, handler_args=[]): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.bind((host, port)) + self.sock.listen(2) + self.handler = handler + self.broadcast = Server.Broadcast() + while 1: + sock, info = self.sock.accept() + _thread.start_new_thread(self.controller, (sock, info, handler_args)) + + + def controller(self, sock, info, handler_args): + sock = ESock(sock) + handler = self.handler(sock, info, self.broadcast, **handler_args) + self.broadcast.add(sock) + while 1: + try: + data, type = handler.sock.recv() + handler.handle(data, type) + except (socket.error, OSError): + self.broadcast.remove(handler.sock) + handler.finish() + handler.sock.close() + _thread.exit() + + + class Handler: + def __init__(self, sock, info, broadcast, **kwargs): + self.sock = sock + self.info = info + self.broadcast = broadcast + self.kwargs = kwargs + self.setup() + + def setup(self): + pass + + def handle(self, data, type): + pass + + def finish(self): + pass + + + class Broadcast: + def __init__(self): + self.socks = [] + + def broadcast(self, data, exclude=[]): + for sock in self.socks: + if not sock in exclude: + sock.send(data) + + def remove(self, sock): + if sock in self.socks: + del self.socks[self.socks.index(sock)] + + def add(self, sock): + if not sock in self.socks: + self.socks.append(sock) \ No newline at end of file diff --git a/Server/Server.py b/Server/Server.py new file mode 100644 index 0000000..e1e43d9 --- /dev/null +++ b/Server/Server.py @@ -0,0 +1,47 @@ +import Logging +import DataTypes + +from .AsyncServer import Server + +class vHandler(Server.Handler): + def setup(self): + Logging.info("Handler for '%s' initalised." % self.info[0]) + self.authed = False + self.users = self.kwargs.pop("users") + + def handle(self, data, type): + if not self.authed: + if type == DataTypes.json: + self.auth(data) + + + def finish(self): + Logging.info("%s disconnected." % self.info[0]) + + + def auth(self, collection): + if "auth" in collection: + if "user" and "pw" in collection["auth"]: + temp_user = User(collection["auth"]["user"], collection["auth"]["pw"]) + if temp_user in self.users: + self.sock.send({"auth" : "success"}) + self.authed = True + return + self.sock.close() + + +class User: + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + if self.username == other.username and self.password == other.password: + return True + return False + + def __repr__(self): + return self.username + + +server = Server("127.0.0.1", 1337, vHandler, {"users" : [User("test", "123")]}) \ No newline at end of file diff --git a/Server/__init__.py b/Server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Sublime/fl0w/Default.sublime-commands b/Sublime/fl0w/Default.sublime-commands new file mode 100644 index 0000000..3425578 --- /dev/null +++ b/Sublime/fl0w/Default.sublime-commands @@ -0,0 +1,6 @@ +[ + { + "caption": "fl0w", + "command": "fl0w" + } +] \ No newline at end of file diff --git a/Sublime/fl0w/SublimeMenu.py b/Sublime/fl0w/SublimeMenu.py new file mode 100644 index 0000000..1e83678 --- /dev/null +++ b/Sublime/fl0w/SublimeMenu.py @@ -0,0 +1,85 @@ +class Input: + def __init__(self, caption, initial_text="", on_done=None, on_change=None, on_cancel=None): + self.caption = caption + self.initial_text = initial_text + self.on_done = on_done + self.on_change = on_change + self.on_cancel = on_cancel + + + def invoke(self, window): + window.show_input_panel(self.caption, self.initial_text, + self.on_done, self.on_change, self.on_cancel) + + +class Item: + def __init__(self, name, description="", action=None, items=None, input=None): + self.name = name + self.description = description + self.action = action + self.items = items + self.input = input + + def __eq__(self, other): + return self.__dict__ == other.__dict__ + + +class Items: + def __init__(self, selected_index=-1, on_highlight=None): + self.selected_index = selected_index + self.on_highlight = on_highlight + self.items = {} + self.item_names = [] + self.window = None + self.back = None + + def invoke(self, window, back=None): + self.window = window + if back: + items = [["Back", "Back to previous menu"]] + self.item_names[:] + print(items) + self.back = back + else: + items = self.item_names + self.back = None + window.show_quick_panel(items, self._action, + flags=0, selected_index=self.selected_index, + on_highlight=self.on_highlight) + + def _action(self, item_id): + if item_id != -1: + if self.back: + if item_id != 0: + item = self.items[item_id - 1] + else: + self.back.invoke(self.window) + return + else: + item = self.items[item_id] + if item.action != None: + item.action() + if item.input != None: + item.input.invoke(self.window) + if item.items != None: + item.items.invoke(self.window, back=self) + + + def add_item(self, item): + if len(self.items) > 0: + item_id = tuple(self.items.keys())[-1] + 1 + else: + item_id = 0 + self.items[item_id] = item + if item.description != None: + self.item_names.append([item.name, item.description]) + else: + self.item_names.append([item.name, ""]) + + def rm_item(self, item): + if item in self.items.values(): + for i in self.items: + if self.items[i] == item: + del self.items[i] + del self.item_names[i] + return True + return False \ No newline at end of file diff --git a/Sublime/fl0w/fl0w.py b/Sublime/fl0w/fl0w.py new file mode 100644 index 0000000..d0f15b4 --- /dev/null +++ b/Sublime/fl0w/fl0w.py @@ -0,0 +1,67 @@ +from sys import path +import os +path.append(os.path.dirname(os.path.realpath(__file__))) + +import sublime +import sublime_plugin +import random +from SublimeMenu import * + + +class Fl0w: + def __init__(self): + self.window = None + self.main_menu = Items() + self.link_menu = Items() + self.link_menu.add_item(Item("Compile", action=self.info)) + self.main_menu.add_item(Item("Connect", "Connect to a fl0w server", action=self.connect)) + self.main_menu.add_item(Item("Set Link", items=self.link_menu)) + + + def info(self): + sublime.message_dialog("No") + + def connect(self): + Input("IP:Port", on_done=self.set_ip).invoke(self.window) + Input("User:", on_done=self.set_ip).invoke(self.window) + Input("Password:", on_done=self.set_ip).invoke(self.window) + + def set_ip(self, ip_pair): + print(ip_pair) + + def authed(self): + + self.main_menu.add_item(Item("Compile", action=self.info)) + self.main_menu.add_item(Item("Resync", action=self.info)) + self.main_menu.add_item(Item("Disconnect", action=self.info)) + self.main_menu.add_item(Item("Backup", action=self.info)) + + +class Fl0wCommand(sublime_plugin.WindowCommand): + def run(self, menu=None, action=None): + if fl0w.window == None: + fl0w.window = self.window + fl0w.main_menu.invoke(self.window) + +""" +def test(): + print("Testing :3") + +def test_input(user_input): + print(user_input) + + +item_handler = Items() +sub_item_handler = Items() + +sub0_test = Item("Test", description="test", action=lol, items=sub_item_handler) +sub0_test1 = Item("Test1", action=test) +sub1_test1 = Item("Test1", action=test, input=Input("Test:", initial_text="Test", on_done=test_input)) + + +sub_item_handler.add_item(sub1_test1) +item_handler.add_item(sub0_test) +item_handler.add_item(sub0_test1) +""" + +fl0w = Fl0w() \ No newline at end of file diff --git a/fl0w.py b/fl0w.py new file mode 100644 index 0000000..a446800 --- /dev/null +++ b/fl0w.py @@ -0,0 +1,3 @@ +from sys import path +from os.path import abspath +path.append(abspath("Shared")) \ No newline at end of file