-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSignQueue.py
169 lines (138 loc) · 5.82 KB
/
SignQueue.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
"""
Some sign fun including:
schedule messages for later
specify message life
message priority - higher is 'higher'
Just do it in SQLite?
yes.
CREATE TABLE "sign_queue" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"message" varchar(140) NOT NULL,
"start_time" datetime NOT NULL,
"life_time" integer not null default 60,
"priority" integer not null default 1,
"add_time" datetime NOT NULL,
"is_active" integer default 0
);
SDC 4/2/2014
"""
import logging
from datetime import datetime
import sqlite3
import sys
import time
LOG_FILENAME = 'signQueue.log'
logger = logging.getLogger(sys.argv[0])
logger.setLevel(logging.INFO)
file_log = logging.FileHandler(LOG_FILENAME,'a')
formatter = logging.Formatter("%(asctime)s - %(name)s - %(lineno)s - %(levelname)s - %(message)s")
file_log.setFormatter(formatter)
logger.addHandler(file_log)
# add console, too!
import simplejson as sj
DATABASE_FILE = "SignQueue.db"
class SignMessage:
def __init__(self, message, start_time=None, life_time = 60, priority = 1, immediate = 0):
if not start_time:
start_time = datetime.now()
self.dict = {"message":message, "start_time":str(start_time), "life_time":life_time, "priority":priority, 'immediate':immediate}
self.json = sj.dumps(self.dict)
class SignQueue:
def __init__(self,databaseFile = DATABASE_FILE):
self.conn = conn = sqlite3.connect(databaseFile)
conn.row_factory = sqlite3.Row
def addMessage(self, message, start_time=None, life_time = 60, priority = 1, immediate = 0): # immediate = 0
#hacky wacky
try:
message = message.dict # if Sign Message (I feel dirty)
except:
print "Guess it's not a sign message"
try:
print "dict"
if type(message) is dict:
# message = message.dict
print "start time"
if message.has_key("start_time"):
start_time = message["start_time"]
print "life_time"
if message.has_key("life_time"):
life_time = message["life_time"]
print "priority"
if message.has_key("priority"):
priority = message["priority"]
print "immediate"
if message.has_key("immediate"):
immediate = message["immediate"]
print "message"
if message.has_key("message"):
print "has key"
message = message["message"]
else:
message = None
except Exception, val:
print "add message is not sign queue type:(%s, %s)" % (Exception, val)
pass
if not message:
return # nothing to do
if not start_time:
start_time = datetime.now()
try:
self.conn.execute("insert into sign_queue (message, start_time, life_time, priority, add_time, immediate) values (?,?,?,?, datetime('now'),?)",(message, start_time, life_time, priority, immediate))
self.conn.commit()
except Exception, val:
self.conn.rollback()
logger.error("fuck up in queue insert: %s, %s" % (Exception, val))
def purgeQueue(self):
self.conn.execute("truncate table sign_queue")
self.conn.commit()
# get: next message w/ highest priority that's not 'active'
# but cycle thru or you are in bad shape
def pullMessage(self):
self.cleanQueue()
result = None
cur = self.conn.cursor()
# immediate is top of the food chain...but have to clear immediate flag.
cur.execute(
"""
select id, message, start_time, life_time, priority from sign_queue where is_active = 0 and immediate = 1 order by start_time asc;
"""
)
r = cur.fetchone()
if not r:
# add condition s.t. higher priority jumps the line! this doesn't get it if lower id has higher priority though!
cur.execute("""
select id, message, start_time, life_time, priority from sign_queue where is_active = 0 and
id > (select id from sign_queue where is_active = 1) order by priority desc, id asc;""")
r = cur.fetchone()
if not r: # loop back around. not super efficient but what you gonna do
cur.execute('select id, message, start_time, life_time, priority from sign_queue where is_active = 0 order by priority desc, id asc;')
r = cur.fetchone()
if r:
print r
result = r
cur.close()
self.conn.execute('update sign_queue set is_active = 0 where is_active = 1')
self.conn.execute('update sign_queue set immediate = 0, is_active = 1 where id = ?', (int(r['id']),))
self.conn.commit()
return result
# any message past it's life time, fuck it, delete it.
def cleanQueue(self):
self.conn.execute("delete from sign_queue where strftime('%s',datetime(current_timestamp,'localtime')) - strftime('%s', datetime(start_time)) > life_time;")
self.conn.commit()
def main():
SQ = SignQueue()
SM = SignMessage("dingy wingy", datetime.now(), 170, 1)
print SM.json
print SM.dict
SQ.addMessage(SM)
SQ.addMessage('welcome to highland lounge!', datetime.now(), 60,1)
SQ.addMessage('Home of Joe Mama\'s Pizza!', datetime.now(), 120,1)
SQ.addMessage('Now 50% meth-free!', datetime.now(), 120,1)
SQ.addMessage('top o da food chain!', datetime.now(), 120,1, 1)
while True:
r = SQ.pullMessage()
if r:
print r['message']
time.sleep(10)
if __name__ == '__main__':
main()