12b43b84be24077fa996e75ded53c771c86311ad
[progcomp2013.git] / qchess / src / log.py
1 log_file = None
2 import datetime
3 import urllib2
4
5 class LogFile():
6         def __init__(self, log):        
7                 
8                 self.log = log
9                 self.logged = []
10                 self.log.write("# Log starts " + str(datetime.datetime.now()) + "\n")
11
12         def write(self, s):
13                 now = datetime.datetime.now()
14                 self.log.write(str(now) + " : " + s + "\n")
15                 self.logged.append((now, s))
16
17         def setup(self, board, players):
18                 
19                 for p in players:
20                         self.log.write("# " + p.colour + " : " + p.name + "\n")
21                 
22                 self.log.write("# Initial board\n")
23                 for x in range(0, w):
24                         for y in range(0, h):
25                                 if board.grid[x][y] != None:
26                                         self.log.write(str(board.grid[x][y]) + "\n")
27
28                 self.log.write("# Start game\n")
29
30         def close(self):
31                 self.log.write("# EOF\n")
32                 self.log.close()
33
34 class HttpLog(LogFile):
35         def __init__(self, file_name):
36                 LogFile.__init__(self, open(file_name, "w", 0))
37                 self.file_name = file_name
38                 self.phase = 0
39
40         def write(self, s):
41                 now = datetime.datetime.now()
42                 self.logged.append((now, s))
43                 
44                 if self.phase == 0:
45                         self.log.close()
46                         self.log = open(self.file_name, "w", 0)
47                         self.log.write("# Short log updated " + str(datetime.datetime.now()) + "\n")    
48                         LogFile.setup(self, game.board, game.players)
49
50                 elif self.phase == 1:
51                         for message in self.logged[len(self.logged)-2:]:
52                                 self.log.write(str(message[0]) + " : " + message[1] + "\n")
53
54                 self.phase = (self.phase + 1) % 2               
55                 
56         def close(self):
57                 self.log.write("# EOF\n")
58                 self.log.close()
59                 
60
61 class HeadRequest(urllib2.Request):
62         def get_method(self):
63                 return "HEAD"
64
65 class HttpGetter(StoppableThread):
66         def __init__(self, address):
67                 StoppableThread.__init__(self)
68                 self.address = address
69                 self.log = urllib2.urlopen(address)
70                 self.lines = []
71                 self.lock = threading.RLock() #lock for access of self.state
72                 self.cond = threading.Condition() # conditional
73
74         def run(self):
75                 while not self.stopped():
76                         line = self.log.readline()
77                         if line == "":
78                                 date_mod = datetime.datetime.strptime(self.log.headers['last-modified'], "%a, %d %b %Y %H:%M:%S GMT")
79                                 self.log.close()
80         
81                                 next_log = urllib2.urlopen(HeadRequest(self.address))
82                                 date_new = datetime.datetime.strptime(next_log.headers['last-modified'], "%a, %d %b %Y %H:%M:%S GMT")
83                                 while date_new <= date_mod and not self.stopped():
84                                         next_log = urllib2.urlopen(HeadRequest(self.address))
85                                         date_new = datetime.datetime.strptime(next_log.headers['last-modified'], "%a, %d %b %Y %H:%M:%S GMT")
86                                 if self.stopped():
87                                         break
88
89                                 self.log = urllib2.urlopen(self.address)
90                                 line = self.log.readline()
91
92                         self.cond.acquire()
93                         self.lines.append(line)
94                         self.cond.notifyAll()
95                         self.cond.release()
96
97                         #sys.stderr.write(" HttpGetter got \'" + str(line) + "\'\n")
98
99                 self.log.close()
100                                 
101                                 
102         
103                 
104                 
105 class HttpReplay():
106         def __init__(self, address):
107                 self.getter = HttpGetter(address)
108                 self.getter.start()
109                 
110         def readline(self):
111                 self.getter.cond.acquire()
112                 while len(self.getter.lines) == 0:
113                         self.getter.cond.wait()
114                         
115                 result = self.getter.lines[0]
116                 self.getter.lines = self.getter.lines[1:]
117                 self.getter.cond.release()
118
119                 return result
120                         
121                         
122         def close(self):
123                 self.getter.stop()
124                                                 
125 def log(s):
126         if log_file != None:
127                 log_file.write(s)
128                 
129
130 def log_init(board, players):
131         if log_file != None:
132                 log_file.setup(board, players)
133

UCC git Repository :: git.ucc.asn.au