Skip to content

Commit

Permalink
overview settings feature
Browse files Browse the repository at this point in the history
  • Loading branch information
ArtificialQualia committed Sep 3, 2018
1 parent 0f4905d commit 435d8e1
Show file tree
Hide file tree
Showing 5 changed files with 435 additions and 39 deletions.
Binary file added PyEveLiveDPS/images/peld-overview-export.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
128 changes: 90 additions & 38 deletions PyEveLiveDPS/logreader.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
'english': {
'character': "(?<=Listener: ).*",
'sessionTime': "(?<=Session Started: ).*",
'pilotAndWeapon': '.*ffffffff>([^\(\)<>]*)(?:\[.*\((.*)\)<|<)/b.*> \-(?: (.*?)(?: \-|<)|.*)',
'pilotAndWeapon': '(?:.*ffffffff>(?P<default_pilot>[^\(\)<>]*)(?:\[.*\((?P<default_ship>.*)\)<|<)/b.*> \-(?: (?P<default_weapon>.*?)(?: \-|<)|.*))',
'damageOut': "\(combat\) <.*?><b>([0-9]+).*>to<",
'damageIn': "\(combat\) <.*?><b>([0-9]+).*>from<",
'armorRepairedOut': "\(combat\) <.*?><b>([0-9]+).*> remote armor repaired to <",
Expand All @@ -57,7 +57,7 @@
'russian': {
'character': "(?<=Слушатель: ).*",
'sessionTime': "(?<=Сеанс начат: ).*",
'pilotAndWeapon': '.*ffffffff>(?:<localized .*?>)?([^\(\)<>]*)(?:\[.*\((?:<localized .*?>)?(.*)\)<|<)/b.*> \-(?: (?:<localized .*?>)?(.*?)(?: \-|<)|.*)',
'pilotAndWeapon': '(?:.*ffffffff>(?:<localized .*?>)?(?P<default_pilot>[^\(\)<>]*)(?:\[.*\((?:<localized .*?>)?(?P<default_ship>.*)\)<|<)/b.*> \-(?: (?:<localized .*?>)?(?P<default_weapon>.*?)(?: \-|<)|.*)',
'damageOut': "\(combat\) <.*?><b>Ущерб ([0-9]+).*> наносит удар по <",
'damageIn': "\(combat\) <.*?><b>Ущерб ([0-9]+).*> удар от <",
'armorRepairedOut': "\(combat\) <.*?><b>([0-9]+).*> единиц запаса прочности брони отремонтировано <",
Expand All @@ -77,7 +77,7 @@
'french': {
'character': "(?<=Auditeur: ).*",
'sessionTime': "(?<=Session commencée: ).*",
'pilotAndWeapon': '.*ffffffff>(?:<localized .*?>)?([^\(\)<>]*)(?:\[.*\((?:<localized .*?>)?(.*)\)<|<)/b.*> \-(?: (?:<localized .*?>)?(.*?)(?: \-|<)|.*)',
'pilotAndWeapon': '(?:.*ffffffff>(?:<localized .*?>)?(?P<default_pilot>[^\(\)<>]*)(?:\[.*\((?:<localized .*?>)?(?P<default_ship>.*)\)<|<)/b.*> \-(?: (?:<localized .*?>)?(?P<default_weapon>.*?)(?: \-|<)|.*)',
'damageOut': "\(combat\) <.*?><b>([0-9]+).*>sur<",
'damageIn': "\(combat\) <.*?><b>([0-9]+).*>de<",
'armorRepairedOut': "\(combat\) <.*?><b>([0-9]+).*> points de blindage transférés à distance à <",
Expand All @@ -97,7 +97,7 @@
'german': {
'character': "(?<=Empfänger: ).*",
'sessionTime': "(?<=Sitzung gestartet: ).*",
'pilotAndWeapon': '.*ffffffff>(?:<localized .*?>)?([^\(\)<>]*)(?:\[.*\((?:<localized .*?>)?(.*)\)<|<)/b.*> \-(?: (?:<localized .*?>)?(.*?)(?: \-|<)|.*)',
'pilotAndWeapon': '(?:.*ffffffff>(?:<localized .*?>)?(?P<default_pilot>[^\(\)<>]*)(?:\[.*\((?:<localized .*?>)?(?P<default_ship>.*)\)<|<)/b.*> \-(?: (?:<localized .*?>)?(?P<default_weapon>.*?)(?: \-|<)|.*)',
'damageOut': "\(combat\) <.*?><b>([0-9]+).*>gegen<",
'damageIn': "\(combat\) <.*?><b>([0-9]+).*>von <",
'armorRepairedOut': "\(combat\) <.*?><b>([0-9]+).*> Panzerungs-Fernreparatur zu <",
Expand All @@ -117,7 +117,7 @@
'japanese': {
'character': "(?<=傍聴者: ).*",
'sessionTime': "(?<=セッション開始: ).*",
'pilotAndWeapon': '.*ffffffff>(?:<localized .*?>)?([^\(\)<>]*)(?:\[.*\((?:<localized .*?>)?(.*)\)<|<)/b.*> \-(?: (?:<localized .*?>)?(.*?)(?: \-|<)|.*)',
'pilotAndWeapon': '(?:.*ffffffff>(?:<localized .*?>)?(?P<default_pilot>[^\(\)<>]*)(?:\[.*\((?:<localized .*?>)?(?P<default_ship>.*)\)<|<)/b.*> \-(?: (?:<localized .*?>)?(?P<default_weapon>.*?)(?: \-|<)|.*)',
'damageOut': "\(combat\) <.*?><b>([0-9]+).*>対象:<",
'damageIn': "\(combat\) <.*?><b>([0-9]+).*>攻撃者:<",
'armorRepairedOut': "\(combat\) <.*?><b>([0-9]+).*> remote armor repaired to <",
Expand All @@ -136,6 +136,8 @@
}
}

_logReaders = []

class CharacterDetector(FileSystemEventHandler):
def __init__(self, mainWindow, characterMenu):
self.mainWindow = mainWindow
Expand All @@ -150,7 +152,7 @@ def __init__(self, mainWindow, characterMenu):
self.path = os.environ['HOME'] + "/Documents/EVE/logs/Gamelogs/"

self.menuEntries = []
self.logReaders = []
self.logReaders = _logReaders
self.selectedIndex = IntVar()
self.playbackLogReader = None

Expand Down Expand Up @@ -179,6 +181,10 @@ def __init__(self, mainWindow, characterMenu):
"Path checked: " + self.path + "\n\n" +
"PELD will continue to run, but will not track EVE data.")
self.characterMenu.menu.add_command(label='No EVE installation detected', state=tk.DISABLED)

self.characterMenu.menu.add_separator()
from settings.overviewSettings import OverviewSettingsWindow
self.characterMenu.menu.add_command(label='Open overview settings', command=OverviewSettingsWindow)

def on_created(self, event):
self.addLog(event.src_path)
Expand Down Expand Up @@ -213,7 +219,7 @@ def addLog(self, logPath):
except BadLogException:
return
self.logReaders.append(newLogReader)
self.characterMenu.menu.add_radiobutton(label=character, variable=self.selectedIndex,
self.characterMenu.menu.insert_radiobutton(0, label=character, variable=self.selectedIndex,
value=len(self.menuEntries), command=self.catchupLog)
self.menuEntries.append(character)

Expand Down Expand Up @@ -249,12 +255,58 @@ def catchupLog(self):
class BaseLogReader():
def __init__(self, logPath, mainWindow):
self.mainWindow = mainWindow

def createOverviewRegex(self, overviewSettings):
if overviewSettings:
def safeGetIndex(elem, _list):
try:
return _list.index(elem)
except ValueError:
return 10
try:
keyLambda = lambda e: safeGetIndex(e[0], overviewSettings['shipLabelOrder'])
sortedShipLabels = sorted(overviewSettings['shipLabels'], key=keyLambda)
pilotAndWeaponRegex = "(?:(?:.*ffffffff>"
for shipLabel in sortedShipLabels[:]:
shipLabel[1] = dict(shipLabel[1])
if not shipLabel[1]['state']:
if shipLabel[1]['type'] in ['pilot name', 'ship type']:
identifier = shipLabel[1]['type'].split()[0]
pilotAndWeaponRegex += '(?P<'+identifier+'>)'
continue
if shipLabel[1]['type'] == None:
safePre = re.escape(shipLabel[1]['pre'])
pilotAndWeaponRegex += '(?:'+safePre+')?'
elif shipLabel[1]['type'] in ['alliance', 'corporation', 'ship name']:
safePre = re.escape(shipLabel[1]['pre'])
safePost = re.escape(shipLabel[1]['post'])
pilotAndWeaponRegex += '(?:'+safePre+'.*?'+safePost+')?'
elif shipLabel[1]['type'] in ['pilot name', 'ship type']:
safePre = re.escape(shipLabel[1]['pre'])
safePost = re.escape(shipLabel[1]['post'])
identifier = shipLabel[1]['type'].split()[0]
pilotAndWeaponRegex += '(?:'+safePre+'(?:<localized .*?>)?(?P<'+identifier+'>.*?)'+safePost+')'
else:
continue
pilotAndWeaponRegex += ".*> \-(?: (?:<localized .*?>)?(?P<weapon>.*?)(?: \-|<)|.*))"
pilotAndWeaponRegex += '|' + _logLanguageRegex[self.language]['pilotAndWeapon'] + ')?'
return pilotAndWeaponRegex
except Exception as e:
logger.error('error parsing overview settings: ' + str(e))
return None
else:
return None

def compileRegex(self):
pilotAndWeaponRegex = _logLanguageRegex[self.language]['pilotAndWeapon']
self.damageOutRegex = re.compile(_logLanguageRegex[self.language]['damageOut'] + pilotAndWeaponRegex)
basicPilotAndWeaponRegex = _logLanguageRegex[self.language]['pilotAndWeapon']
basicPilotAndWeaponRegex += '(?P<pilot>)(?P<ship>)(?P<weapon>)'

overviewSettings = settings.getOverviewSettings(self.character)
pilotAndWeaponRegex = self.createOverviewRegex(overviewSettings) or basicPilotAndWeaponRegex

self.damageOutRegex = re.compile(_logLanguageRegex[self.language]['damageOut'] + basicPilotAndWeaponRegex)

self.damageInRegex = re.compile(_logLanguageRegex[self.language]['damageIn'] + pilotAndWeaponRegex)
self.damageInRegex = re.compile(_logLanguageRegex[self.language]['damageIn'] + basicPilotAndWeaponRegex)

self.armorRepairedOutRegex = re.compile(_logLanguageRegex[self.language]['armorRepairedOut'] + pilotAndWeaponRegex)
self.hullRepairedOutRegex = re.compile(_logLanguageRegex[self.language]['hullRepairedOut'] + pilotAndWeaponRegex)
Expand Down Expand Up @@ -299,34 +351,34 @@ def readLog(self, logData):

def extractValues(self, regex, logData, mining=False):
returnValue = []
group = regex.findall(logData)
group = regex.finditer(logData)
if mining:
if group:
for amount,type in group:
if amount != 0:
returnGroup = {}
if settings.getMiningM3Setting():
if type in _oreVolume:
returnGroup['amount'] = int(amount) * _oreVolume[type]
else:
returnGroup['amount'] = int(amount)
else:
returnGroup['amount'] = int(amount)
returnValue.append(returnGroup)
return returnValue
if group:
for match in group:
if match[0] != 0:
amount = match.group(1)
_type = match.group(2)
if amount != 0:
returnGroup = {}
returnGroup['amount'] = int(match[0])
returnGroup['pilotName'] = match[1].strip()
returnGroup['shipType'] = match[2]
if returnGroup['shipType'] == '':
returnGroup['shipType'] = returnGroup['pilotName']
returnGroup['weaponType'] = match[3]
if returnGroup['weaponType'] == '':
returnGroup['weaponType'] = 'Unknown'
if settings.getMiningM3Setting():
if _type in _oreVolume:
returnGroup['amount'] = int(amount) * _oreVolume[_type]
else:
returnGroup['amount'] = int(amount)
else:
returnGroup['amount'] = int(amount)
returnValue.append(returnGroup)
return returnValue
for match in group:
amount = match.group(1) or 0
pilotName = match.group('default_pilot') or match.group('pilot') or '?'
shipType = match.group('ship') or match.group('default_ship') or pilotName
weaponType = match.group('default_weapon') or match.group('weapon') or 'Unknown'
if amount != 0:
returnGroup = {}
returnGroup['amount'] = int(amount)
returnGroup['pilotName'] = pilotName.strip()
returnGroup['shipType'] = shipType
returnGroup['weaponType'] = weaponType
returnValue.append(returnGroup)
return returnValue

class PlaybackLogReader(BaseLogReader):
Expand All @@ -345,7 +397,7 @@ def __init__(self, logPath, mainWindow):
raise BadLogException("not character log")
characterLine = self.log.readline()
try:
character, self.language = ProcessCharacterLine(characterLine)
self.character, self.language = ProcessCharacterLine(characterLine)
except BadLogException:
messagebox.showerror("Error", "This doesn't appear to be a EVE combat log.\nPlease select a different file.")
raise BadLogException("not character log")
Expand Down Expand Up @@ -441,16 +493,16 @@ def __init__(self, logPath, mainWindow):
self.log.readline()
self.log.readline()
characterLine = self.log.readline()
character, self.language = ProcessCharacterLine(characterLine)
self.character, self.language = ProcessCharacterLine(characterLine)
logger.info('Log language is ' + self.language)
self.log.readline()
self.log.readline()
self.logLine = self.log.readline()
if (self.logLine == "------------------------------------------------------------\n"):
self.log.readline()
collisionCharacter, language = ProcessCharacterLine(self.log.readline())
logger.error('Log file collision on characters' + character + " and " + collisionCharacter)
messagebox.showerror("Error", "Log file collision on characters:\n\n" + character + " and " + collisionCharacter +
logger.error('Log file collision on characters' + self.character + " and " + collisionCharacter)
messagebox.showerror("Error", "Log file collision on characters:\n\n" + self.character + " and " + collisionCharacter +
"\n\nThis happens when both characters log in at exactly the same second.\n" +
"This makes it impossible to know which character owns which log.\n\n" +
"Please restart the client of the character you want to track to use this program.\n" +
Expand Down
2 changes: 1 addition & 1 deletion PyEveLiveDPS/mainWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def __init__(self):
logger.exception("Error adding PELD to Windows taskbar. This should never happen, but execution can continue normally.")
logger.exception(e)

# label that appears at the top of the window that displays in special modes like simulation and playback modes
# label that appears at the top of the window in special modes like simulation and playback modes
self.topLabel = tk.Label(self, text="Simulation Mode", fg="white", background="black")
font = tkFont.Font(font=self.topLabel['font'])
font.config(slant='italic')
Expand Down
Loading

0 comments on commit 435d8e1

Please sign in to comment.