Fixed networking!
[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("# " + str(p.colour) + " : " + str(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 class FileReplay():
136         def __init__(self, filename):
137                 self.f = open(filename, "r", 0)
138                 self.filename = filename
139                 self.mod = os.path.getmtime(filename)
140                 self.count = 0
141         
142         def readline(self):
143                 line = self.f.readline()
144                 
145                 while line == "":
146                         mod2 = os.path.getmtime(self.filename)
147                         if mod2 > self.mod:
148                                 #sys.stderr.write("File changed!\n")
149                                 self.mod = mod2
150                                 self.f.close()
151                                 self.f = open(self.filename, "r", 0)
152                                 
153                                 new_line = self.f.readline()
154                                 
155                                 if " ".join(new_line.split(" ")[0:3]) != "# Short log":
156                                         for i in range(self.count):
157                                                 new_line = self.f.readline()
158                                                 #sys.stderr.write("Read back " + str(i) + ": " + str(new_line) + "\n")
159                                         new_line = self.f.readline()
160                                 else:
161                                         self.count = 0
162                                 
163                                 line = new_line
164
165                 self.count += 1
166                 return line
167
168         def close(self):
169                 self.f.close()
170                 
171                                                 
172 def log(s):
173         for l in log_files:
174                 l.write(s)
175                 
176 def debug(s):
177         sys.stderr.write("# DEBUG: " + s + "\n")
178                 
179
180 def log_init(board, players):
181         for l in log_files:
182                 l.setup(board, players)
183

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