first examples and bugfixes
* qt application to browse collected sessions * fix in game.log StartingLevel. * note for virtualenv users
This commit is contained in:
parent
a24f05c6be
commit
ec852c3b0e
@ -38,7 +38,7 @@ settings = {'analyze_path': os.path.join(os.path.expanduser('~'),
|
||||
def select_parsing_sessions(alist):
|
||||
# for micro controlling, which sessions to parse.
|
||||
# default: return alist
|
||||
return alist[-50:]
|
||||
return alist
|
||||
|
||||
if __name__ == '__main__':
|
||||
# set this to your liking:
|
||||
|
@ -170,7 +170,10 @@ class StartingLevel(GameLog):
|
||||
__slots__ = GameLog.__slots__
|
||||
# level, gametype, unknown_gametype
|
||||
matcher = [
|
||||
re.compile(r"^======\sstarting\slevel\:\s'(?P<level>[^']+)'(?:\s|client|(?P<gametype>KingOfTheHill)|(?P<unknown_gametype>[^\s]+))+======"),
|
||||
|
||||
re.compile(r"^======\sstarting\slevel\:\s'(?P<level>[^']+)'\s(?P<gametype>[^\s]+)\sclient\s======"),
|
||||
re.compile(r"^======\sstarting\slevel\:\s'(?P<level>[^']+)'\s(?P<gametype>[^\s]+)\s======"),
|
||||
re.compile(r"^======\sstarting\slevel\:\s'(?P<level>[^']+)'\s+======"),
|
||||
]
|
||||
|
||||
@classmethod
|
||||
|
132
src/scon/qlogviewer.py
Normal file
132
src/scon/qlogviewer.py
Normal file
@ -0,0 +1,132 @@
|
||||
import os, io, sys, logging, time
|
||||
from PyQt5 import QtGui, QtCore, Qt
|
||||
from scon.logs.session import LogSessionCollector
|
||||
from scon.logs import game, combat, chat
|
||||
|
||||
class SessionTreeView(Qt.QTreeView):
|
||||
def __init__(self, parent):
|
||||
super(SessionTreeView, self).__init__(parent)
|
||||
self.root_model = Qt.QStandardItemModel()
|
||||
self.setModel(self.root_model)
|
||||
self.doubleClicked.connect(self.onClickItem)
|
||||
self.sessions = None
|
||||
self.coll = None
|
||||
|
||||
def _populateTree(self, children, parent):
|
||||
for child in sorted(children):
|
||||
child_item = Qt.QStandardItem(child)
|
||||
child_item.setEditable(False)
|
||||
#child_item.clicked.connect(self.onClickItem)
|
||||
parent.appendRow(child_item)
|
||||
if isinstance(children, dict):
|
||||
|
||||
if isinstance(children[child], dict):
|
||||
self._populateTree(children[child], child_item)
|
||||
|
||||
|
||||
def load_from_directory(self, directory):
|
||||
# collect all logs in a directory.
|
||||
self.coll = LogSessionCollector(directory)
|
||||
# get all unique sessions from this
|
||||
self.sessions = self.coll.collect_unique()
|
||||
# populate our tree with this dictionary.
|
||||
self._populateTree(self.sessions, self.root_model.invisibleRootItem())
|
||||
|
||||
def onClickItem (self, signal):
|
||||
|
||||
try:
|
||||
#print (dir(signal))
|
||||
# get the QStandardItem for this entry:
|
||||
item = signal.model().itemFromIndex(signal)
|
||||
#print (signal.row(), signal.column(), signal.data())
|
||||
if not item.parent():
|
||||
if item.hasChildren():
|
||||
print ("Already open.")
|
||||
return
|
||||
session = self.sessions[signal.data()]
|
||||
session.parse_files(['game.log'])
|
||||
info_object = Qt.QStandardItem('game.log - %s' % len(session.game_log.lines))
|
||||
info_object.setEditable(False)
|
||||
item.appendRow(info_object)
|
||||
#
|
||||
# add all starting events
|
||||
for line in session.game_log.lines:
|
||||
if isinstance(line, game.StartingLevel):
|
||||
line.unpack()
|
||||
v = line.values
|
||||
o = Qt.QStandardItem("Level '%s' gametype '%s'" %( v.get('level'),
|
||||
v.get('gametype', '') ))
|
||||
o.setEditable(False)
|
||||
info_object.appendRow(o)
|
||||
|
||||
return
|
||||
session.parse_files(['combat.log'])
|
||||
info_object = Qt.QStandardItem('combat.log - %s' % len(session.combat_log.lines))
|
||||
info_object.setEditable(False)
|
||||
item.appendRow(info_object)
|
||||
#
|
||||
session.parse_files(['chat.log'])
|
||||
info_object = Qt.QStandardItem('chat.log - %s' % len(session.chat_log.lines))
|
||||
info_object.setEditable(False)
|
||||
item.appendRow(info_object)
|
||||
except:
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
class MainWindow(Qt.QWidget):
|
||||
def __init__(self):
|
||||
super(MainWindow, self).__init__()
|
||||
# setup our main window here.
|
||||
|
||||
# setup the directory of your operations
|
||||
# see list of all sessions
|
||||
# slowly pre scan all sessions
|
||||
# if a session is opened, display its contents
|
||||
|
||||
# http://stackoverflow.com/questions/27898718/multi-level-qtreeview
|
||||
self.tree = SessionTreeView(self)
|
||||
layout = Qt.QHBoxLayout(self)
|
||||
layout.addWidget(self.tree)
|
||||
|
||||
#self.tree.itemClicked.connect(self.onClickItem)
|
||||
self.tree.load_from_directory(os.path.join(os.path.expanduser('~'), 'Documents', 'My Games', 'sc'))
|
||||
|
||||
# or delayed (not good for debug):
|
||||
|
||||
#t = Qt.QTimer()
|
||||
#t.singleShot(2, lambda: self.load_from_directory(
|
||||
# os.path.join(os.path.expanduser('~'),
|
||||
# 'Documents', 'My Games', 'sc'))
|
||||
# ,
|
||||
# )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def _main():
|
||||
app = Qt.QApplication(sys.argv)
|
||||
window = MainWindow()
|
||||
window.resize(640, 480)
|
||||
window.show()
|
||||
return app.exec_()
|
||||
|
||||
def main():
|
||||
r = _main()
|
||||
try:
|
||||
import psutil #@UnresolvedImport
|
||||
except ImportError:
|
||||
logging.warning('Cannot import PsUtil, terminating without cleaning up threads explicitly.')
|
||||
sys.exit(r)
|
||||
|
||||
def kill_proc_tree(pid, including_parent=True):
|
||||
parent = psutil.Process(pid)
|
||||
if including_parent:
|
||||
parent.kill()
|
||||
me = os.getpid()
|
||||
kill_proc_tree(me)
|
||||
sys.exit(r)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
7
virtualenv.rst
Normal file
7
virtualenv.rst
Normal file
@ -0,0 +1,7 @@
|
||||
Note on windows:
|
||||
- if you virtualenv python3, make sure to copy following data over to your newly created virtualenv:
|
||||
* copy Python3.dll in main python directory -> virtualenv/Scripts
|
||||
- needed for Qt5, so gui based things. not needed if you use the library only.
|
||||
- a dll called Python3x.dll should already exist there.
|
||||
* tcl directories need to be copied over for some libraries using it
|
||||
- (this project currently does not need that)
|
Loading…
Reference in New Issue
Block a user