X-Git-Url: https://git.ucc.asn.au/?p=uccvend-vendserver.git;a=blobdiff_plain;f=sql-edition%2Fservers%2FIdler.py;h=5b6645517945891c49dd79b8ff6f1c62077410a3;hp=a231d96a1e63fdd0c51db2c0cc2d613f4bfb0780;hb=8796ba14bcff4d89b76d32d28146527fd6f329f1;hpb=33cd17ec630302925f6b36fcc45923c882a970f5 diff --git a/sql-edition/servers/Idler.py b/sql-edition/servers/Idler.py index a231d96..5b66455 100755 --- a/sql-edition/servers/Idler.py +++ b/sql-edition/servers/Idler.py @@ -1,24 +1,60 @@ #!/usr/bin/env python -import string, time +import string, time, os +from subprocess import Popen, PIPE from random import random from MessageKeeper import MessageKeeper orderings = None +IDLER_TEXT_SPEED=1.8 + class Idler: def __init__(self, v): self.v = v def next(self): - pass + """Displays next stage of the idler. Returns time to the next step""" + return 1 def reset(self): + """Resets the idler to a known intial state""" pass def finished(self): + """Returns True if the idler is considered finished""" return False + def affinity(self): + """How much we want this idler to be the next one chosen""" + return 1 + +class GreetingIdler(Idler): + def __init__(self, v, secs_to_greeting = None): + self.v = v + self.secs_to_greeting = secs_to_greeting + self.message_displayed = False + + def next(self): + if not self.secs_to_greeting is None: + x = self.secs_to_greeting + self.secs_to_greeting = None + return x + + self.v.display('UCC SNACKS') + self.message_displayed = True + return 5 + + def reset(self): + self.message_displayed = False + self.secs_to_greeting = None + + def finished(self): + return self.message_displayed + + def affinity(self): + return 0 + class TrainIdler(Idler): def __init__(self, v): self.idle_state = 0 @@ -84,28 +120,37 @@ class TrainIdler(Idler): class OrderMaker: def __init__(self, n=8): self.n = n - self.a = [] - self.u = [] - self.s = [] - for x in range(0,n): - self.u.append(False) - self.go() - - def go(self): - from copy import deepcopy - if len(self.s) == self.n: - self.a.append(deepcopy(self.s)) - else: - for x in range(0,self.n): - if self.u[x]: continue - self.s.append(x) - self.u[x] = True - self.go() - self.u[x] = False - self.s.pop() - - def order(self): - return self.a + self.make_factorials(n) + + def make_factorials(self, n): + self.factorial = [] + a = 1 + for i in range(1,n+1): + self.factorial.append(a) + a *= i + + def order(self, index): + used = [] + for i in range(0,self.n): + used.append(i) + i = self.n-1 + j = 0 + res = [] + while i >= 0: + a = index/self.factorial[i] + index %= self.factorial[i] + res.append(a+1) + i -= 1 + j += 1 + for i in range(0,self.n): + tmp = used[res[i]-1] + for j in range(res[i],self.n): + used[j-1] = used[j] + res[i] = tmp + return res + + def __getitem__(self, i): + return self.order(i) class GrayIdler(Idler): def __init__(self, v, one=None, zero=None, reorder=0): @@ -119,7 +164,7 @@ class GrayIdler(Idler): self.reorder = reorder global orderings if not orderings: - orderings = OrderMaker().order() + orderings = OrderMaker() def next(self): output = self.do_next_state() @@ -186,12 +231,12 @@ class GrayIdler(Idler): class StringIdler(Idler): - def __init__(self, v, text="Hello Cruel World! "): + def __init__(self, v, text="Hello Cruel World! ",repeat=True): self.v = v self.mk = MessageKeeper(v) - self.text = self.clean_text(text) + self.text = self.clean_text(text) + " " - msg = [("",False, None),(self.text, True, 0.8)] + msg = [("",False, None),(self.text, repeat, IDLER_TEXT_SPEED)] self.mk.set_messages(msg) def clean_text(self, text): @@ -213,13 +258,58 @@ class StringIdler(Idler): def next(self): self.mk.update_display() + def finished(self): + return self.mk.done() + class ClockIdler(Idler): def __init__(self, v): self.v = v self.last = None def next(self): - output = time.strftime("%H:%M:%S") + colonchar = ':' + if int(time.time()*2) & 1: colonchar = ' ' + output = time.strftime("%%H%c%%M%c%%S"%(colonchar,colonchar)) if output != self.last: self.v.display(" %8.8s " % (output)) self.last = output + + def affinity(self): + return 3 + +class FortuneIdler(StringIdler): + def __init__(self, v): + fortune = "/usr/games/fortune" + text = "I broke my wookie...." + if os.access(fortune,os.F_OK|os.X_OK): + (lines, unused) = Popen((fortune,), close_fds=True, stdout=PIPE).communicate() + text = string.join(lines) + StringIdler.__init__(self, v, text,repeat=False) + + def affinity(self): + return 20 + +class PipeIdler(StringIdler): + def __init__(self, v, command, args): + text = "I ate my cookie...." + if os.access(command,os.F_OK|os.X_OK): + (lines, unused) = Popen([command,] + args.split(), close_fds=True, stdout=PIPE).communicate() + text = string.join(lines) + StringIdler.__init__(self, v, text,repeat=False) + + def affinity(self): + return 20 + +class FileIdler(StringIdler): + def __init__(self, v, thefile=None, repeat=False, affinity=8): + text = "I broke my wookie...." + self._affinity = affinity + + if file and os.access(thefile,os.F_OK|os.R_OK): + f = file(thefile,'r') + text = string.join(f.readlines()) + f.close() + StringIdler.__init__(self, v, text,repeat=repeat) + + def affinity(self): + return self._affinity