X-Git-Url: https://git.ucc.asn.au/?p=uccvend-vendserver.git;a=blobdiff_plain;f=sql-edition%2Fservers%2FIdler.py;h=ff73c2af89779c1092a7cd0ff79a3df0a8a40ab6;hp=555630f038e212f0bf64e4c1a19b82af09fc3727;hb=08a392617c464e6336d47ba37168c3a3a2529123;hpb=fe057d5b30168e9918d17a239c8bfdd5bffcd46d diff --git a/sql-edition/servers/Idler.py b/sql-edition/servers/Idler.py index 555630f..ff73c2a 100755 --- a/sql-edition/servers/Idler.py +++ b/sql-edition/servers/Idler.py @@ -1,19 +1,58 @@ #!/usr/bin/env python -import string +import string, time, popen2, os 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): @@ -80,28 +119,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() + 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 order(self): - return self.a + def __getitem__(self, i): + return self.order(i) class GrayIdler(Idler): def __init__(self, v, one=None, zero=None, reorder=0): @@ -115,7 +163,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() @@ -178,4 +226,93 @@ class GrayIdler(Idler): self.i = 0 self.grayCode = 0 if self.reorder: - self.reorder = int(random()*40320) + self.reorder = int(random()*40319)+1 + + +class StringIdler(Idler): + def __init__(self, v, text="Hello Cruel World! ",repeat=True): + self.v = v + self.mk = MessageKeeper(v) + self.text = self.clean_text(text) + " " + + msg = [("",False, None),(self.text, repeat, IDLER_TEXT_SPEED)] + self.mk.set_messages(msg) + + def clean_text(self, text): + # nothing like a bit of good clean text :) + valid = string.digits \ + + string.letters \ + + string.punctuation \ + + " " + # uppercase it + text = string.upper(text) + clean = "" + for char in text: + if char in valid: + clean = clean + char + else: + clean = clean + " " + return clean + + 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): + 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): + (stdout, stdin) = popen2.popen2(fortune) + text = string.join(stdout.readlines()) + stdout.close() + stdin.close() + 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): + (stdout, stdin) = popen2.popen2(command+' '+args) + text = string.join(stdout.readlines()) + stdout.close() + stdin.close() + 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