def add_oneline(msg): """ Add a oneliner to the local database. """ import time from x84.bbs import getsession, DBProxy, ini session = getsession() udb = DBProxy('oneliner') udb.acquire() udb[max([int(key) for key in udb.keys()] or [0]) + 1] = { 'oneliner': msg, 'alias': getsession().handle, 'bbsname': ini.CFG.get('system', 'bbsname'), 'timestamp': time.strftime('%Y-%m-%d %H:%M:%S'), } udb.release() session.buffer_event('oneliner_update', True) session.send_event('global', ('oneliner_update', True))
def add_comment(key): """ Prompt user to add a comment about a bbs. """ # pylint: disable=R0914 # Too many local variables. from x84.bbs import getsession, getterminal, echo, DBProxy, LineEditor from x84.bbs import getch session, term = getsession(), getterminal() prompt_comment = u'\r\n\r\nWhAt YOU GOt tO SAY? ' prompt_chg = u'\r\n\r\nChANGE EXiStiNG ? [yn] ' echo(term.move(term.height, 0)) echo(prompt_comment) comment = LineEditor(max(10, term.width - len(prompt_comment) - 5)).read() if comment is None or 0 == len(comment.strip()): return new_entry = (session.handle, comment) comments = DBProxy('bbslist', 'comments') comments.acquire() existing = comments[key] if session.handle in (_nick for (_nick, _cmt) in comments[key]): # change existing comment, echo(prompt_chg) if getch() not in (u'y', u'Y'): comments.release() return # re-define list without existing entry, + new entry comments[key] = [(_enick, _ecmt) for (_enick, _ecmt) in existing if session.handle != _enick] + [new_entry] comments.release() return # re-define as existing list + new entry comments[key] = existing + [new_entry] comments.release()
def rate_bbs(key): """ Prompt user to rate a bbs. """ # pylint: disable=R0914 # Too many local variables from x84.bbs import getsession, getterminal, echo, LineEditor, DBProxy from x84.bbs import getch session, term = getsession(), getterminal() prompt_rating = u'\r\n\r\nRAtE 0.0 - 4.0: ' prompt_chg = u'\r\n\r\nChANGE EXiStiNG ? [yn] ' msg_invalid = u'\r\n\r\niNVAlid ENtRY.\r\n' echo(term.move(term.height, 0) + '\r\n') echo(prompt_rating) s_rating = LineEditor(3).read() if s_rating is None or 0 == len(s_rating.strip()): return try: f_rating = float(s_rating) except ValueError: echo(msg_invalid) return if f_rating < 0 or f_rating > 4: echo(msg_invalid) return entry = (session.handle, f_rating) ratings = DBProxy('bbslist', 'ratings') ratings.acquire() if session.handle in (_handle for (_handle, _rating) in ratings[key]): echo(prompt_chg) if getch() not in (u'y', u'Y'): ratings.release() return # re-define list without existing entry, + new entry ratings[key] = [(__handle, __rating) for (__handle, __rating) in ratings[key] if session.handle != __handle] + [entry] ratings.release() return # re-define as existing list + new entry ratings[key] = ratings[key] + [entry] ratings.release()
def main(): """ Main procedure. """ # pylint: disable=R0914,R0912 # Too many local variables # Too many branches from x84.bbs import DBProxy, getsession, getterminal, echo from x84.bbs import ini, LineEditor, timeago, showart from x84.bbs import disconnect, getch import time import os session, term = getsession(), getterminal() session.activity = 'logging off' handle = session.user.handle or 'anonymous' max_user = ini.CFG.getint('nua', 'max_user') prompt_msg = u'[spnG]: ' if session.user.get('expert', False) else ( u'%s:AY SOMEthiNG %s:REViOUS %s:EXt %s:Et thE f**k Off !\b' % ( term.bold_blue_underline(u's'), term.bold_blue_underline(u'p'), term.bold_blue_underline(u'n'), term.red_underline(u'Escape/g'),)) prompt_say = u''.join((term.bold_blue(handle), term.bold_blue(u' SAYS WhAt'), term.bold(': '),)) boards = (('1984.ws', 'x/84 dEfAUlt bOARd', 'Dingo',), ('htc.zapto.org', 'Haunting the Chapel', 'Mercyful fate',), ('bbs.pharcyde.org', 'Pharcyde BBS', 'Access Denied',), ('bloodisland.ph4.se', 'Blood Island/X', 'Xzippo',), ('blackflag.acid.org:2627', 'Piranha: Black Flag', 'Caphood',), ('oddnetwork.org', '79 columns', 'Haliphax'), ('bbs.beardy.se', 'The Swamp', 'Beardy'), ('maze.io', 'rANDOM nOIZE', 'Maze'),) board_fmt = u'%25s %-30s %-15s\r\n' goodbye_msg = u''.join(( term.move(term.height, 0), u'\r\n' * 10, u'tRY ANOthER fiNE bOARd', term.bold(u':'), u'\r\n\r\n', board_fmt % ( term.underline('host'.rjust(25)), term.underline('board'.ljust(30)), term.underline('sysop'.ljust(15)),), u'\r\n'.join([board_fmt % ( term.bold(host.rjust(25)), term.reverse(board.center(30)), term.bold_underline(sysop),) for (host, board, sysop) in boards]), u'\r\n\r\n', term.bold( u'back to the mundane world...'), u'\r\n',)) commit_msg = term.bold_blue( u'-- ! thANk YOU fOR YOUR CONtRibUtiON, bROthER ! --') write_msg = term.red_reverse( u'bURNiNG tO ROM, PlEASE WAiT ...') db_firstrecord = ((time.time() - 1984, u'B. b.', u'bEhAVE YOURSElVES ...'),) automsg_len = 40 def refresh_prompt(msg): """ Refresh automsg prompt using string msg. """ echo(u''.join((u'\r\n\r\n', term.clear_eol, msg))) def refresh_automsg(idx): """ Refresh automsg database, display automsg of idx, return idx. """ session.flush_event('automsg') autodb = DBProxy('automsg') automsgs = sorted(autodb.values()) if len(autodb) else db_firstrecord dblen = len(automsgs) # bounds check if idx < 0: idx = dblen - 1 elif idx > dblen - 1: idx = 0 tm_ago, handle, msg = automsgs[idx] asc_ago = u'%s ago' % (timeago(time.time() - tm_ago)) disp = u''.join(('\r\n\r\n', term.bold(handle.rjust(max_user)), term.bold_blue(u'/'), term.bold_blue(u'%*d' % (len('%d' % (dblen,)), idx,)), term.bold_blue(u':'), term.bold_green(msg.ljust(automsg_len)), term.bold(u'\\'), term.bold_blue(asc_ago),)) echo(u'\r\n'.join(term.wrap(disp))) return idx def refresh_all(idx=None): """ refresh screen, database, and return database index """ echo(u''.join((u'\r\n\r\n', term.clear_eol,))) for line in showart( os.path.join(os.path.dirname(__file__), 'art', 'logoff.ans'), 'cp437'): echo(line) idx = refresh_automsg(-1 if idx is None else idx) refresh_prompt(prompt_msg) return idx idx = refresh_all() while True: if session.poll_event('refresh'): idx = refresh_all() elif session.poll_event('automsg'): refresh_automsg(-1) echo(u'\a') # bel refresh_prompt(prompt_msg) inp = getch(1) if inp in (u'g', u'G', term.KEY_EXIT, unichr(27), unichr(3),): # http://www.xfree86.org/4.5.0/ctlseqs.html # Restore xterm icon and window title from stack. echo(unichr(27) + u'[23;0t') echo(goodbye_msg) getch(1.5) disconnect('logoff.') elif inp in (u'n', u'N', term.KEY_DOWN, term.KEY_NPAGE,): idx = refresh_automsg(idx + 1) refresh_prompt(prompt_msg) elif inp in (u'p', u'P', term.KEY_UP, term.KEY_PPAGE,): idx = refresh_automsg(idx - 1) refresh_prompt(prompt_msg) elif inp in (u's', u'S'): # new prompt: say something ! refresh_prompt(prompt_say) msg = LineEditor(width=automsg_len).read() if msg is not None and msg.strip(): echo(u''.join((u'\r\n\r\n', write_msg,))) autodb = DBProxy('automsg') autodb.acquire() idx = max([int(ixx) for ixx in autodb.keys()] or [-1]) + 1 autodb[idx] = (time.time(), handle, msg.strip()) autodb.release() session.send_event('global', ('automsg', True,)) refresh_automsg(idx) echo(u''.join((u'\r\n\r\n', commit_msg,))) getch(0.5) # for effect, LoL # display prompt refresh_prompt(prompt_msg)
def main(): """ Main procedure. """ # pylint: disable=R0914,R0912 # Too many local variables # Too many branches from x84.bbs import DBProxy, getsession, getterminal, echo from x84.bbs import ini, LineEditor, timeago, Ansi, showcp437 from x84.bbs import disconnect, getch import time import os session, term = getsession(), getterminal() session.activity = 'logging off' handle = session.handle if ( session.handle is not None ) else 'anonymous' max_user = ini.CFG.getint('nua', 'max_user') prompt_msg = u'[spnG]: ' if session.user.get('expert', False) else ( u'%s:AY SOMEthiNG %s:REViOUS %s:EXt %s:Et thE f**k Off !\b' % ( term.bold_blue_underline(u's'), term.blue_underline(u'p'), term.blue_underline(u'n'), term.red_underline(u'Escape/g'),)) prompt_say = u''.join((term.bold_blue(handle), term.blue(u' SAYS WhAt'), term.bold(': '),)) boards = (('1984.ws', 'x/84 dEfAUlt bOARd', 'dingo',), ('htc.zapto.org', 'Haunting the Chapel', 'Mercyful',), ('pharcyde.ath.cx', 'Pharcyde BBS', 'Access Denied',), ('bloodisland.ph4.se', 'Blood Island', 'xzip',), ('ssl.archaicbinary.net', 'Archaic Binary', 'Wayne Smith',), ('bbs.godta.com', 'godta', 'sk-5',) ,) board_fmt = u'%25s %-30s %-15s\r\n' goodbye_msg = u''.join(( term.move(term.height, 0), u'\r\n' * 10, u'tRY ANOthER fiNE bOARd', term.bold(u':'), u'\r\n\r\n', board_fmt % ( term.underline('host'.rjust(25)), term.underline('board'.ljust(30)), term.underline('sysop'.ljust(15)),), u'\r\n'.join([board_fmt % ( term.bold(host.rjust(25)), term.reverse(board.center(30)), term.bold_underline(sysop),) for (host, board, sysop) in boards]), u'\r\n\r\n', term.bold( u'back to the mundane world...'), u'\r\n',)) commit_msg = term.bold_blue( u'-- ! thANk YOU fOR YOUR CONtRibUtiON, bROthER ! --') write_msg = term.red_reverse( u'bURNiNG tO ROM, PlEASE WAiT ...') db_firstrecord = ((time.time() - 1984, u'B. b.', u'bEhAVE YOURSElVES ...'),) automsg_len = 40 artfile = os.path.join(os.path.dirname(__file__), 'art', '1984.asc') def refresh_prompt(msg): """ Refresh automsg prompt using string msg. """ echo(u''.join((u'\r\n\r\n', term.clear_eol, msg))) def refresh_automsg(idx): """ Refresh automsg database, display automsg of idx, return idx. """ session.flush_event('automsg') autodb = DBProxy('automsg') automsgs = sorted(autodb.values()) if len(autodb) else db_firstrecord dblen = len(automsgs) # bounds check if idx < 0: idx = dblen - 1 elif idx > dblen - 1: idx = 0 tm_ago, handle, msg = automsgs[idx] asc_ago = u'%s ago' % (timeago(time.time() - tm_ago)) disp = (u''.join(('\r\n\r\n', term.bold(handle.rjust(max_user)), term.bold_blue(u'/'), term.blue(u'%*d' % (len('%d' % (dblen,)), idx,)), term.bold_blue(u':'), term.blue_reverse(msg.ljust(automsg_len)), term.bold(u'\\'), term.blue(asc_ago),))) echo(u''.join(( u'\r\n\r\n', Ansi(disp).wrap(term.width), ))) return idx def refresh_all(idx=None): """ refresh screen, database, and return database index """ echo(u''.join((u'\r\n\r\n', term.clear_eol,))) for line in showcp437(artfile): echo(line) idx = refresh_automsg(-1 if idx is None else idx) refresh_prompt(prompt_msg) return idx idx = refresh_all() while True: if session.poll_event('refresh'): idx = refresh_all() elif session.poll_event('automsg'): refresh_automsg(-1) echo(u'\a') # bel refresh_prompt(prompt_msg) inp = getch(1) if inp in (u'g', u'G', term.KEY_EXIT, unichr(27), unichr(3),): # http://www.xfree86.org/4.5.0/ctlseqs.html # Restore xterm icon and window title from stack. echo(unichr(27) + u'[23;0t') echo(goodbye_msg) getch(1.5) disconnect('logoff.') elif inp in (u'n', u'N', term.KEY_DOWN, term.KEY_NPAGE,): idx = refresh_automsg(idx + 1) refresh_prompt(prompt_msg) elif inp in (u'p', u'P', term.KEY_UP, term.KEY_PPAGE,): idx = refresh_automsg(idx - 1) refresh_prompt(prompt_msg) elif inp in (u's', u'S'): # new prompt: say something ! refresh_prompt(prompt_say) msg = LineEditor(width=automsg_len).read() if msg is not None and msg.strip(): echo(u''.join((u'\r\n\r\n', write_msg,))) autodb = DBProxy('automsg') autodb.acquire() idx = max([int(ixx) for ixx in autodb.keys()] or [-1]) + 1 autodb[idx] = (time.time(), handle, msg.strip()) autodb.release() session.send_event('global', ('automsg', True,)) refresh_automsg(idx) echo(u''.join((u'\r\n\r\n', commit_msg,))) getch(0.5) # for effect, LoL # display prompt refresh_prompt(prompt_msg)