commit
07432b33c5
2 changed files with 244 additions and 0 deletions
@ -0,0 +1,243 @@
|
||||
#!/usr/bin/env python3 |
||||
|
||||
import os |
||||
import sys |
||||
import sqlite3 as sql |
||||
import datetime, time |
||||
import subprocess |
||||
|
||||
class c: |
||||
black = '' |
||||
red = '\033[0;31m' |
||||
b_red = '\033[1;31m' |
||||
yellow = '\033[1;33m' |
||||
green = '\033[0;32m' |
||||
b_green = '\033[1;32m' |
||||
cyan = '\033[0;36m' |
||||
b_cyan = '\033[1;36m' |
||||
purple = '\033[1;35m' |
||||
blue = '\033[0;34m' |
||||
b_blue = '\033[1;34m' |
||||
white = '\033[1;37m' |
||||
end = '\033[0m' |
||||
|
||||
db_path = './cspc.sqlite' |
||||
userdir = os.path.expanduser('~') |
||||
user = os.path.split(userdir)[-1] |
||||
topic = None |
||||
post = None |
||||
available_ids = [] |
||||
|
||||
|
||||
def go_back(): |
||||
global post |
||||
global topic |
||||
|
||||
# If just viewed a post |
||||
if post and topic: |
||||
post = None |
||||
else: |
||||
post = None |
||||
topic = None |
||||
|
||||
|
||||
def get_prompt(): |
||||
if post: |
||||
ident = 'Post'.format(post) |
||||
elif topic: |
||||
ident = 'Posts'.format(topic) |
||||
else: |
||||
ident = 'Topics' |
||||
return '{}CSPC [{}{}{}] {}>{} '.format(c.yellow, c.white, ident, c.yellow, c.b_green, c.end) |
||||
|
||||
|
||||
def get_data(): |
||||
if post and topic: |
||||
# sql to view a post and its replies |
||||
pass |
||||
elif topic: |
||||
get_posts() |
||||
else: |
||||
get_topics() |
||||
|
||||
|
||||
def show_help(): |
||||
print('This is a help menu placeholder') |
||||
|
||||
|
||||
def make_add(): |
||||
action = False |
||||
if post and topic: |
||||
action = 'reply' |
||||
elif topic: |
||||
action = 'post' |
||||
else: |
||||
action = 'topic' |
||||
verify = input('{}Are you sure you would like to add a new {}{}{} (y/n)?{} '.format(c.cyan, c.b_blue, action, c.cyan, c.end)) |
||||
verify = verify.lower() |
||||
if verify in ['y','yes','yeah','yup','ya']: |
||||
add_new(action) |
||||
|
||||
|
||||
def add_new(a): |
||||
header = " 5 10 15 20 25 30 35 40 45 50\n ....|....|....|....|....|....|....|....|....|....|" |
||||
|
||||
title = None |
||||
body = None |
||||
|
||||
if not a == 'reply': |
||||
title = input('{}Enter the new {}s title:{} '.format(c.white, a, c.end)) |
||||
|
||||
content = [] |
||||
|
||||
if not a == 'topic': |
||||
print('{}Enter your content. To finish, enter a period as the only\ntext on its row.{}'.format(c.yellow, c.end)) |
||||
print(header) |
||||
|
||||
while True: |
||||
line = input('{}>{} '.format(c.green, c.end)) |
||||
if line == '.': |
||||
break |
||||
content.append(line) |
||||
|
||||
confirm = input('{}Submit the new {} (y/n)?{} '.format(c.white, a, c.end)) |
||||
if confirm.lower() in ['y','ya','yes','yeah']: |
||||
body = '\n'.join(content) |
||||
else: |
||||
print('{} not saved'.format(a)) |
||||
return False |
||||
|
||||
payload = {'title': title, 'body': body} |
||||
add_to_db(a, payload) |
||||
|
||||
|
||||
def parse_command(com): |
||||
global topic |
||||
global post |
||||
|
||||
comlist = ['add', 'help', 'quit', 'back'] |
||||
if com == 'back': |
||||
go_back() |
||||
elif com == 'help': |
||||
show_help() |
||||
elif com in ['quit', 'q', 'exit']: |
||||
sys.exit(0) |
||||
elif com == 'add': |
||||
make_add() |
||||
elif com == 'rm': |
||||
make_delete() |
||||
else: |
||||
try: |
||||
ident = int(com) |
||||
if not ident in available_ids: |
||||
print('{}ERROR: {} is not an available option!\n'.format(c.red, com, c.end)) |
||||
return False |
||||
if not topic: |
||||
topic = ident |
||||
elif not post: |
||||
post = ident |
||||
else: |
||||
print('{}A number command is not relevant right now...{}'.format(c.purple, c.end)) |
||||
except ValueError: |
||||
print('{}Input not recognized{}'.format(c.red, c.end)) |
||||
|
||||
#------- DB Related --------# |
||||
|
||||
def check_and_build_db(): |
||||
if not os.path.isfile(db_path): |
||||
conn = sql.connect(db_path) |
||||
c = conn.cursor() |
||||
|
||||
c.execute("CREATE TABLE data (topic_id INTEGER DEFAULT NULL, post_id INTEGER DEFAULT NULL, type text NOT NULL, title text DEFAULT NULL, body text DEFAULT NULL, author text NOT NULL, last_updated INTEGER NOT NULL)") |
||||
|
||||
conn.commit() |
||||
conn.close() |
||||
|
||||
def db_do(query, var=False, noresval=False): |
||||
if os.path.isfile(db_path): |
||||
conn = sql.connect(db_path) |
||||
c = conn.cursor() |
||||
if var: |
||||
c.execute(query, var) |
||||
else: |
||||
c.execute(query) |
||||
if noresval: |
||||
out = c.rowcount |
||||
else: |
||||
out = [] |
||||
for row in c: |
||||
out.append(row) |
||||
conn.commit() |
||||
conn.close() |
||||
return out |
||||
else: |
||||
print("{}ERROR:{} Database cannot be found or is corrupt".format(c.red, c.end)) |
||||
return False |
||||
|
||||
|
||||
def get_posts(): |
||||
global available_ids |
||||
global topic |
||||
available_ids = [] |
||||
q = "SELECT rowid, title, author, last_updated FROM data WHERE type = 'post' and topic_id = ? ORDER BY last_updated DESC" |
||||
v = (topic,) |
||||
res = db_do(q, v) |
||||
print('{}{:^6} | {:^35} | {:^12} | {:^18}{}'.format(c.yellow, 'ID', 'Post Title', 'Author', 'Last Updated', c.end)) |
||||
if not len(res): |
||||
print('{}There are no posts for this topic yet. Add one!{}'.format(c.cyan, c.end)) |
||||
else: |
||||
for row in res: |
||||
available_ids.append(row[0]) |
||||
dtime = datetime.datetime.utcfromtimestamp(row[3]).strftime('%Y-%m-%d %H:%M') |
||||
title = row[1] |
||||
if len(title) > 35: |
||||
title = '{}...'.format(title[:32]) |
||||
print('({:^4}) | {:35} | {:12} | {:18}'.format(row[0], title, row[2], dtime)) |
||||
return True |
||||
|
||||
|
||||
def get_topics(): |
||||
global available_ids |
||||
available_ids = [] |
||||
q = "SELECT title, last_updated, rowid FROM data WHERE type = 'topic' ORDER BY last_updated DESC" |
||||
res = db_do(q) |
||||
print('{}{:^6} | {:35} | {:18}{}'.format(c.yellow, 'ID', 'Topic Name', 'Last Updated', c.end)) |
||||
for row in res: |
||||
available_ids.append(row[2]) |
||||
dtime = datetime.datetime.utcfromtimestamp(row[1]).strftime('%Y-%m-%d %H:%M') |
||||
title = row[0] |
||||
if len(title) > 35: |
||||
title = '{}...'.format(title[:32]) |
||||
print('({:^4}) | {}{:35}{} | {:18}'.format(row[2], c.cyan, title, c.end, dtime)) |
||||
return True |
||||
|
||||
|
||||
def add_to_db(action, data): |
||||
update_time = int(time.time()) |
||||
q = "INSERT INTO data VALUES (?, ?, ?, ?, ?, ?, ?)" |
||||
v = (topic, post, action, data['title'], data['body'], user, update_time) |
||||
res = db_do(q, v, noresval=True) |
||||
if not res: |
||||
print("{}ERROR:{} There was an error adding your topic".format(c.red, c.end)) |
||||
return False |
||||
return True |
||||
|
||||
#------- Main loop --------# |
||||
|
||||
def mainloop(): |
||||
while True: |
||||
subprocess.run(['clear']) |
||||
print('{}Colorfield Space Bulletin Board{}\n\n'.format(c.b_blue, c.end)) |
||||
output = get_data() |
||||
# print the formatted data |
||||
print('') |
||||
command = input(get_prompt()) |
||||
print('') |
||||
if not command: |
||||
continue |
||||
parse_command(command) |
||||
|
||||
|
||||
if __name__ == '__main__': |
||||
check_and_build_db() |
||||
mainloop() |
Loading…
Reference in new issue