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