1ef8145bb43ba337e90263edb93ac37ecc4f8f06
[progcomp2013.git] / qchess / src / log.py
1 log_files = []
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                 if self.log != sys.stdout:
33                         self.log.close()
34
35 class ShortLog(LogFile):
36         def __init__(self, file_name):
37                 if file_name == "":
38                         self.log = sys.stdout
39                 else:
40                         self.log = open(file_name, "w", 0)
41                 LogFile.__init__(self, self.log)
42                 self.file_name = file_name
43                 self.phase = 0
44
45         def write(self, s):
46                 now = datetime.datetime.now()
47                 self.logged.append((now, s))
48                 
49                 if self.phase == 0:
50                         if self.log != sys.stdout:
51                                 self.log.close()
52                                 self.log = open(self.file_name, "w", 0)
53                         self.log.write("# Short log updated " + str(datetime.datetime.now()) + "\n")    
54                         LogFile.setup(self, game.board, game.players)
55
56                 elif self.phase == 1:
57                         for message in self.logged[len(self.logged)-2:]:
58                                 self.log.write(str(message[0]) + " : " + message[1] + "\n")
59
60                 self.phase = (self.phase + 1) % 2               
61                 
62         def close(self):
63                 if self.phase == 1:
64                         ending = self.logged[len(self.logged)-1]
65                         self.log.write(str(ending[0]) + " : " + ending[1] + "\n")
66                 self.log.write("# EOF\n")
67                 if self.log != sys.stdout:
68                         self.log.close()
69                 
70
71 class HeadRequest(urllib2.Request):
72         def get_method(self):
73                 return "HEAD"
74
75 class HttpGetter(StoppableThread):
76         def __init__(self, address):
77                 StoppableThread.__init__(self)
78                 self.address = address
79                 self.log = urllib2.urlopen(address)
80                 self.lines = []
81                 self.lock = threading.RLock() #lock for access of self.state
82                 self.cond = threading.Condition() # conditional
83
84         def run(self):
85                 while not self.stopped():
86                         line = self.log.readline()
87                         if line == "":
88                                 date_mod = datetime.datetime.strptime(self.log.headers['last-modified'], "%a, %d %b %Y %H:%M:%S GMT")
89                                 self.log.close()
90         
91                                 next_log = urllib2.urlopen(HeadRequest(self.address))
92                                 date_new = datetime.datetime.strptime(next_log.headers['last-modified'], "%a, %d %b %Y %H:%M:%S GMT")
93                                 while date_new <= date_mod and not self.stopped():
94                                         next_log = urllib2.urlopen(HeadRequest(self.address))
95                                         date_new = datetime.datetime.strptime(next_log.headers['last-modified'], "%a, %d %b %Y %H:%M:%S GMT")
96                                 if self.stopped():
97                                         break
98
99                                 self.log = urllib2.urlopen(self.address)
100                                 line = self.log.readline()
101
102                         self.cond.acquire()
103                         self.lines.append(line)
104                         self.cond.notifyAll()
105                         self.cond.release()
106
107                         #sys.stderr.write(" HttpGetter got \'" + str(line) + "\'\n")
108
109                 self.log.close()
110                                 
111                                 
112         
113                 
114                 
115 class HttpReplay():
116         def __init__(self, address):
117                 self.getter = HttpGetter(address)
118                 self.getter.start()
119                 
120         def readline(self):
121                 self.getter.cond.acquire()
122                 while len(self.getter.lines) == 0:
123                         self.getter.cond.wait()
124                         
125                 result = self.getter.lines[0]
126                 self.getter.lines = self.getter.lines[1:]
127                 self.getter.cond.release()
128
129                 return result
130                         
131                         
132         def close(self):
133                 self.getter.stop()
134                                                 
135 def log(s):
136         for l in log_files:
137                 l.write(s)
138                 
139
140 def log_init(board, players):
141         for l in log_files:
142                 l.setup(board, players)
143

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