Skip to content

Commit

Permalink
integration with PELD-Server
Browse files Browse the repository at this point in the history
  • Loading branch information
ArtificialQualia committed Aug 11, 2018
1 parent 0f4905d commit 6a173a9
Show file tree
Hide file tree
Showing 9 changed files with 271 additions and 15 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -102,4 +102,5 @@ ENV/
.mypy_cache/

/.project
/.pydevproject
/.pydevproject
/.settings
9 changes: 7 additions & 2 deletions PyEveLiveDPS/animate.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ def __init__(self, mainWindow, **kwargs):
self.labelHandler = mainWindow.labelHandler
self.characterDetector = mainWindow.characterDetector
self.detailsHandler = mainWindow.detailsWindow.detailsHandler
self.queue = None

self.slowDown = False
self.simulationEnabled = False
Expand Down Expand Up @@ -93,6 +94,9 @@ def animate(self):

# pops old values, adds new values, and passes those to the graph and other handlers
for category, items in self.categories.items():
if self.queue and category != 'mining':
for entry in items["newEntry"]:
self.queue.put({"category": category, "entry": entry})
# if items["settings"] is empty, this isn't a category that is being tracked
if items["settings"]:
# remove old values
Expand Down Expand Up @@ -164,9 +168,10 @@ def changeSettings(self):
self.graph.subplot.clear()
if self.simulationEnabled:
self.simulationSettings(enable=False)
self.mainWindow.mainMenu.menu.delete(3)
self.mainWindow.mainMenu.menu.insert_command(3, label="Simulate Input", command=lambda: simulationWindow.SimulationWindow(self.mainWindow))
self.mainWindow.mainMenu.menu.delete(5)
self.mainWindow.mainMenu.menu.insert_command(5, label="Simulate Input", command=lambda: simulationWindow.SimulationWindow(self.mainWindow))
self.mainWindow.topLabel.grid_remove()
self.mainWindow.mainMenu.menu.entryconfig(3, state="normal")

self.slowDown = False
self.seconds = settings.getSeconds()
Expand Down
133 changes: 133 additions & 0 deletions PyEveLiveDPS/fleetWindow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@

import tkinter as tk
import tkinter.font as tkFont
from peld import settings
import socketManager

class FleetWindow(tk.Toplevel):
def __init__(self, mainWindow):
tk.Toplevel.__init__(self)

self.mainWindow = mainWindow
self.counter = 0

characterEntries = mainWindow.characterDetector.menuEntries
if len(characterEntries) == 0:
self.destroy()
tk.messagebox.showerror("Error", "PELD must be tracking a character before enabling fleet mode.")
characterIndex = mainWindow.characterDetector.selectedIndex.get()
self.characterName = characterEntries[characterIndex]

self.columnconfigure(0, weight=1)
self.columnconfigure(9, weight=1)
self.configure(pady=10)

self.wm_attributes("-topmost", True)
self.wm_title("PyEveLiveDPS Fleet Mode")
try:
self.iconbitmap(sys._MEIPASS + '\\app.ico')
except Exception:
try:
self.iconbitmap("app.ico")
except Exception:
pass
self.geometry("375x310")
self.update_idletasks()

characterFrame = tk.Frame(self)
tk.Label(characterFrame, text="Character to use for fleet mode: ").grid(row="0", column="1", sticky="w")
nameLabel = tk.Label(characterFrame, text=self.characterName)
font = tkFont.Font(font=nameLabel['font'])
font.config(weight='bold')
nameLabel['font'] = font
nameLabel.grid(row="0", column="2", sticky="w")
nameDescription = tk.Label(self, text="To use a different character for fleet mode, choose a different\n" +
" character in the 'Character...' menu on the main window")
font = tkFont.Font(font=nameDescription['font'])
font.config(slant='italic')
nameDescription['font'] = font
characterFrame.grid(row=self.counter, column="1", columnspan="2", sticky="w")
nameDescription.grid(row=self.counter+1, column="1", columnspan="2", sticky="w")
tk.Frame(self, height="15", width="10").grid(row=self.counter+2, column="1", columnspan="2")
self.counter += 3

self.serverVar = tk.StringVar()
self.serverVar.set(settings.fleetServer)
self.addEntrySetting(self.serverVar, "Server to use: ",
"Don't change this unless your FC tells you to")

self.modeVar = tk.IntVar()
self.modeVar.set(1)
tk.Radiobutton(self, text="Fleet Member", variable=self.modeVar, value=1).grid(row=self.counter, column="1", sticky="w")
self.counter += 1
tk.Radiobutton(self, text="FC (requires fleet boss)", variable=self.modeVar, value=2).grid(row=self.counter, column="1", sticky="w")
self.counter += 1
tk.Frame(self, height="10", width="10").grid(row=self.counter, column="1", columnspan="5")
self.counter += 1

self.lowCPUVar = tk.BooleanVar()
self.lowCPUVar.set(False)
lowCPUCheckbutton = tk.Checkbutton(self, text="Use low CPU mode", variable=self.lowCPUVar)
lowCPUCheckbutton.grid(row=self.counter, column="1", columnspan="2", sticky="w")
descriptor = tk.Label(self, text="Most features will be disabled, but networking will work normally")
font = tkFont.Font(font=descriptor['font'])
font.config(slant='italic')
descriptor['font'] = font
descriptor.grid(row=self.counter+1, column="1", columnspan="2", sticky="w")
tk.Frame(self, height="10", width="10").grid(row=self.counter+2, column="1", columnspan="2")
self.counter += 3

tk.Frame(self, height="10", width="1").grid(row="99", column="1", columnspan="5")

buttonFrame = tk.Frame(self)
buttonFrame.grid(row="100", column="0", columnspan="10")
okButton = tk.Button(buttonFrame, text=" Login ", command=self.login)
okButton.grid(row="0", column="0")
tk.Frame(buttonFrame, height="1", width="30").grid(row="0", column="1")
cancelButton = tk.Button(buttonFrame, text=" Cancel ", command=self.destroy)
cancelButton.grid(row="0", column="2")

def login(self):
settings.fleetServer = self.serverVar.get()
requestArgs = "/sso/login?read_fleet=esi-fleets.read_fleet.v1"
if self.modeVar.get() == 1:
requestArgs += "&login_type=member"
else:
requestArgs += "&write_fleet=esi-fleets.write_fleet.v1"
requestArgs += "&login_type=fc"
self.sockMgr = socketManager.SocketManager(self.serverVar.get(), self.characterName, requestArgs)
self.sockMgr.start()
self.mainWindow.mainMenu.menu.delete(3)
self.mainWindow.mainMenu.menu.insert_command(3, label="End Fleet Mode", command=self.logout)
self.mainWindow.mainMenu.menu.entryconfig(5, state="disabled")
self.mainWindow.mainMenu.menu.entryconfig(6, state="disabled")
self.mainWindow.topLabel.configure(text="Fleet Mode (" + self.characterName + ")")
self.mainWindow.topLabel.grid()
self.mainWindow.characterMenu.configure(state="disabled")
self.mainWindow.animator.queue = self.sockMgr.queue
self.destroy()

def logout(self):
self.mainWindow.animator.queue = None
self.sockMgr.stop()
self.mainWindow.mainMenu.menu.delete(3)
self.mainWindow.mainMenu.menu.insert_command(3, label="Fleet Mode", command=lambda: FleetWindow(self.mainWindow))
self.mainWindow.mainMenu.menu.entryconfig(5, state="normal")
self.mainWindow.mainMenu.menu.entryconfig(6, state="normal")
self.mainWindow.topLabel.grid_remove()
self.mainWindow.characterMenu.configure(state="normal")

def addEntrySetting(self, var, labelText, descriptorText):
centerFrame = tk.Frame(self)
centerFrame.grid(row=self.counter, column="1", columnspan="2", sticky="w")
label = tk.Label(centerFrame, text=labelText)
label.grid(row=self.counter, column="1", sticky="w")
entry = tk.Entry(centerFrame, textvariable=var, width=25)
entry.grid(row=self.counter, column="2", sticky="w")
descriptor = tk.Label(self, text=descriptorText)
font = tkFont.Font(font=descriptor['font'])
font.config(slant='italic')
descriptor['font'] = font
descriptor.grid(row=self.counter+1, column="1", columnspan="2", sticky="w")
tk.Frame(self, height="10", width="10").grid(row=self.counter+2, column="1", columnspan="5")
self.counter += 3
13 changes: 9 additions & 4 deletions PyEveLiveDPS/mainWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import simulationWindow
import labelHandler
import animate
import fleetWindow
from peld import logger
from peld import settings
from baseWindow import BaseWindow
Expand Down Expand Up @@ -151,6 +152,8 @@ def addMenus(self):

self.mainMenu.menu.add_cascade(label="Profile", menu=self.profileMenu)
self.mainMenu.menu.add_separator()
self.mainMenu.menu.add_command(label="Fleet Mode", command=lambda: fleetWindow.FleetWindow(self))
self.mainMenu.menu.add_separator()
self.mainMenu.menu.add_command(label="Simulate Input", command=lambda: simulationWindow.SimulationWindow(self))
getLogFilePath = lambda: tk.filedialog.askopenfilename(initialdir=self.characterDetector.path, title="Select log file")
self.mainMenu.menu.add_command(label="Playback Log", command=lambda: self.characterDetector.playbackLog(getLogFilePath()))
Expand Down Expand Up @@ -246,8 +249,9 @@ def collapseEvent(self, event):

def addPlaybackFrame(self, startTime, endTime):
""" adds the playback frame underneath the graph when in 'playback' mode """
self.mainMenu.menu.delete(4)
self.mainMenu.menu.insert_command(4, label="Stop Log Playback", command=self.characterDetector.stopPlayback)
self.mainMenu.menu.entryconfig(3, state="disabled")
self.mainMenu.menu.delete(6)
self.mainMenu.menu.insert_command(6, label="Stop Log Playback", command=self.characterDetector.stopPlayback)
self.topLabel.configure(text="Playback Mode")
self.topLabel.grid()
self.playbackFrame = playbackFrame.PlaybackFrame(self, startTime, endTime)
Expand All @@ -256,8 +260,9 @@ def addPlaybackFrame(self, startTime, endTime):
def removePlaybackFrame(self):
""" removes the playback frame when we leave playback mode """
getLogFilePath = lambda: tk.filedialog.askopenfilename(initialdir=self.characterDetector.path, title="Select log file")
self.mainMenu.menu.delete(4)
self.mainMenu.menu.insert_command(4, label="Playback Log", command=lambda: self.characterDetector.playbackLog(getLogFilePath()))
self.mainMenu.menu.entryconfig(3, state="normal")
self.mainMenu.menu.delete(6)
self.mainMenu.menu.insert_command(6, label="Playback Log", command=lambda: self.characterDetector.playbackLog(getLogFilePath()))
self.topLabel.grid_remove()
self.playbackFrame.grid_remove()
self.animator.catchup()
Expand Down
4 changes: 2 additions & 2 deletions PyEveLiveDPS/peld.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,12 @@ def ApplyLoggerSettings():
try:
App()
except Exception as e:
logger = logging.getLogger('peld')
logger = logging.getLogger()
logger.exception(e)
else:
# this gets hit on all imports from other files, which happens before the app starts
# this allows easy sharing of the logger and settings references
logger = logging.getLogger(__name__)
logger = logging.getLogger()
SetupLogger()
settings = settings.Settings()
ApplyLoggerSettings()
Expand Down
19 changes: 18 additions & 1 deletion PyEveLiveDPS/settings/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class Settings(FileSystemEventHandler):
defaultProfile = [ {
"profile": "Default",
"logLevel": 20,
"fleetServer": "peld-fleet.com",
"profileSettings":
{ "windowX": 0, "windowY": 0,
"windowHeight": 225, "windowWidth": 350,
Expand Down Expand Up @@ -434,6 +435,22 @@ def detailsOrder(self):
def detailsOrder(self, value):
self.currentProfile["detailsOrder"] = value
self.writeSettings()

@property
def fleetServer(self):
for profile in self.allSettings:
if (profile["profile"] == "Default"):
if not profile.get("fleetServer"):
profile["fleetServer"] = self.defaultProfile[0]["fleetServer"]
self.writeSettings()
return profile.get("fleetServer")

@fleetServer.setter
def fleetServer(self, value):
for profile in self.allSettings:
if (profile["profile"] == "Default"):
profile["fleetServer"] = value
self.writeSettings()

def setSettings(self, capDamageIn=None, capDamageOut=None, capRecieved=None, capTransfered=None,
dpsIn=None, dpsOut=None, logiIn=None, logiOut=None, mining=None,
Expand Down Expand Up @@ -502,7 +519,7 @@ def switchProfile(self):
self.writeSettings()

def writeSettings(self):
logger = logging.getLogger('peld')
logger = logging.getLogger()
logger.info('New settings:')
logger.info(str(self.currentProfile))
tempFile = os.path.join(self.path, "PELD_temp.json")
Expand Down
10 changes: 6 additions & 4 deletions PyEveLiveDPS/simulationWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,9 @@ def doSimulation(self):
tk.messagebox.showerror("Error", "Please enter only whole, positive numbers for all values")
return

self.mainWindow.mainMenu.menu.delete(3)
self.mainWindow.mainMenu.menu.insert_command(3, label="Stop Simulation", command=self.stopSimulation)
self.mainWindow.mainMenu.menu.delete(5)
self.mainWindow.mainMenu.menu.insert_command(5, label="Stop Simulation", command=self.stopSimulation)
self.mainWindow.mainMenu.menu.entryconfig(3, state="disabled")

self.mainWindow.topLabel.configure(text="Simulation Mode")
self.mainWindow.topLabel.grid()
Expand All @@ -124,6 +125,7 @@ def doSimulation(self):
def stopSimulation(self):
self.animator.simulationSettings(enable=False)
self.mainWindow.characterDetector.catchupLog()
self.mainWindow.mainMenu.menu.delete(3)
self.mainWindow.mainMenu.menu.insert_command(3, label="Simulate Input", command=lambda: SimulationWindow(self.mainWindow))
self.mainWindow.mainMenu.menu.delete(5)
self.mainWindow.mainMenu.menu.insert_command(5, label="Simulate Input", command=lambda: SimulationWindow(self.mainWindow))
self.mainWindow.mainMenu.menu.entryconfig(3, state="normal")
self.mainWindow.topLabel.grid_remove()
92 changes: 92 additions & 0 deletions PyEveLiveDPS/socketManager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import tkinter as tk
from peld import logger
import threading
import uuid
import webbrowser
import queue
import time
from socketIO_client import SocketIO, BaseNamespace

class SocketNotificationWindow(tk.Toplevel):
def __init__(self):
tk.Toplevel.__init__(self)

self.configure(pady=10, padx=20)

self.wm_attributes("-topmost", True)
self.wm_title("PyEveLiveDPS Awaiting Login")
try:
self.iconbitmap(sys._MEIPASS + '\\app.ico')
except Exception:
try:
self.iconbitmap("app.ico")
except Exception:
pass
self.geometry("200x50")
self.update_idletasks()

tk.Label(self, text='Waiting for you to login...').grid(row=1, column=1)

class SocketManager(threading.Thread):
def __init__(self, server, characterName, loginArgs):
threading.Thread.__init__(self, name="socket_manager")
self.server = "http://" + server
self.characterName = characterName
self.loginArgs = loginArgs
self.loginArgs += "&character_name=" + self.characterName
self.guid = str(uuid.uuid4())
self.loginArgs += "&socket_guid=" + self.guid
self.queue = queue.Queue()
self.daemon = True
self.running = True
self.registered = False
global _sockMgr
_sockMgr = self

def run(self):
self.loginWindow = SocketNotificationWindow()
webbrowser.open(self.server + self.loginArgs)
self.socket = SocketIO(self.server, verify=False,
cookies={'socket_guid': self.guid, 'name': self.characterName})
self.namespace = self.socket.define(Namespace, '/client')
while not self.registered:
self.namespace.emit('register_client')
self.socket.wait(2)
timeWaiting = 30.0
while self.running:
while not self.queue.empty():
self.namespace.emit('peld_data', self.queue.get())
time.sleep(0.1)
timeWaiting += 0.1
if timeWaiting >= 30:
self.namespace.emit('peld_check')
timeWaiting = 0.0


def stop(self):
self.running = False
self.registered = True
try:
self.namespace.disconnect()
self.socket.disconnect()
except AttributeError:
logger.error('Socket manager missing attributes, web page probably never loaded for ' + self.server)

class Namespace(BaseNamespace):
def on_connect(self):
logger.info('Connected websocket to ' + _sockMgr.server)

def on_disconnect(self):
logger.info('Websocket disconnected from ' + _sockMgr.server)

def on_reconnect(self):
logger.info('Websocket reconnected to ' + _sockMgr.server)
_sockMgr.registered = False
while not _sockMgr.registered:
self.emit('register_client')
_sockMgr.socket.wait(2)

def on_client_registered(self, *args):
logger.info('Websocket client registered with server')
_sockMgr.loginWindow.destroy()
_sockMgr.registered = True
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
matplotlib==2.0.2
watchdog==0.8.3
watchdog==0.8.3
socketIO-client==0.7.2

0 comments on commit 6a173a9

Please sign in to comment.