def receive_message_from(board_id, request_data, db_source, db_transactions): " Reply-to api client request to post a new message. " from x84.bbs.msgbase import to_localtime, Msg log = logging.getLogger(__name__) if 'message' not in request_data: return server_error(log.info, u'No message') pullmsg = request_data['message'] # validate for key in (_key for _key in VALIDATE_MSG_KEYS if _key not in pullmsg): return server_error( log_func=log.info, log_msg=('Missing message sub-field, {key!r}'.format(key=key))) msg = Msg() msg.author = pullmsg['author'] msg.recipient = pullmsg['recipient'] msg.subject = pullmsg['subject'] msg.parent = pullmsg['parent'] msg.tags = set(pullmsg['tags'] + [request_data['network']]) msg.body = pullmsg['body'] # ?? is this removing millesconds, or ? _ctime = to_localtime(pullmsg['ctime'].split('.', 1)[0]) msg.save(send_net=False, ctime=_ctime) with db_source, db_transactions: db_source[msg.idx] = board_id db_transactions[msg.idx] = msg.idx return {u'response': True, u'id': msg.idx}
def receive_message_from(board_id, request_data, db_source, db_transactions): " Reply-to api client request to post a new message. " from x84.bbs.msgbase import to_localtime, Msg log = logging.getLogger(__name__) if 'message' not in request_data: return server_error(log.info, u'No message') pullmsg = request_data['message'] # validate for key in (_key for _key in VALIDATE_MSG_KEYS if _key not in pullmsg): return server_error(log_func=log.info, log_msg=('Missing message sub-field, {key!r}' .format(key=key))) msg = Msg() msg.author = pullmsg['author'] msg.recipient = pullmsg['recipient'] msg.subject = pullmsg['subject'] msg.parent = pullmsg['parent'] msg.tags = set(pullmsg['tags'] + [request_data['network']]) msg.body = pullmsg['body'] # ?? is this removing millesconds, or ? _ctime = to_localtime(pullmsg['ctime'].split('.', 1)[0]) msg.save(send_net=False, ctime=_ctime) with db_source, db_transactions: db_source[msg.idx] = board_id db_transactions[msg.idx] = msg.idx return {u'response': True, u'id': msg.idx}
def poll_network_for_messages(net): " pull for new messages of network, storing locally. " from x84.bbs import Msg, DBProxy from x84.bbs.msgbase import to_localtime log = logging.getLogger(__name__) log.debug(u'[{net[name]}] polling for new messages.'.format(net=net)) try: last_msg_id = get_last_msg_id(net['last_file']) except (OSError, IOError) as err: log.error('[{net[name]}] skipping network: {err}'.format(net=net, err=err)) return msgs = pull_rest(net=net, last_msg_id=last_msg_id) if msgs is not False: log.info('{net[name]} Retrieved {num} messages'.format(net=net, num=len(msgs))) else: log.debug('{net[name]} no messages.'.format(net=net)) return transdb = DBProxy('{0}trans'.format(net['name']), use_session=False) transkeys = transdb.keys() msgs = sorted(msgs, cmp=lambda x, y: cmp(int(x['id']), int(y['id']))) # store messages locally, saving their translated IDs to the transdb for msg in msgs: store_msg = Msg() store_msg.recipient = msg['recipient'] store_msg.author = msg['author'] store_msg.subject = msg['subject'] store_msg.body = msg['body'] store_msg.tags = set(msg['tags']) store_msg.tags.add(u''.join((net['name']))) if msg['recipient'] is None and u'public' not in msg['tags']: log.warn("{net[name]} No recipient (msg_id={msg[id]}), " "adding 'public' tag".format(net=net, msg=msg)) store_msg.tags.add(u'public') if (msg['parent'] is not None and str(msg['parent']) not in transkeys): log.warn('{net[name]} No such parent message ({msg[parent]}, ' 'msg_id={msg[id]}), removing reference.'.format(net=net, msg=msg)) elif msg['parent'] is not None: store_msg.parent = int(transdb[msg['parent']]) if msg['id'] in transkeys: log.warn('{net[name]} dupe (msg_id={msg[id]}) discarded.'.format( net=net, msg=msg)) else: # do not save this message to network, we already received # it from the network, set send_net=False store_msg.save(send_net=False, ctime=to_localtime(msg['ctime'])) with transdb: transdb[msg['id']] = store_msg.idx transkeys.append(msg['id']) log.info( '{net[name]} Processed (msg_id={msg[id]}) => {new_id}'.format( net=net, msg=msg, new_id=store_msg.idx)) if 'last' not in net.keys() or int(net['last']) < int(msg['id']): net['last'] = msg['id'] if 'last' in net.keys(): with open(net['last_file'], 'w') as last_fp: last_fp.write(str(net['last'])) return
def poll_network_for_messages(net): " pull for new messages of network, storing locally. " from x84.bbs import Msg, DBProxy from x84.bbs.msgbase import to_localtime log = logging.getLogger(__name__) log.debug(u'[{net[name]}] polling for new messages.'.format(net=net)) try: last_msg_id = get_last_msg_id(net['last_file']) except (OSError, IOError) as err: log.error('[{net[name]}] skipping network: {err}' .format(net=net, err=err)) return msgs = pull_rest(net=net, last_msg_id=last_msg_id) if msgs is not False: log.info('{net[name]} Retrieved {num} messages' .format(net=net, num=len(msgs))) else: log.debug('{net[name]} no messages.'.format(net=net)) return transdb = DBProxy('{0}trans'.format(net['name']), use_session=False) transkeys = transdb.keys() msgs = sorted(msgs, cmp=lambda x, y: cmp(int(x['id']), int(y['id']))) # store messages locally, saving their translated IDs to the transdb for msg in msgs: store_msg = Msg() store_msg.recipient = msg['recipient'] store_msg.author = msg['author'] store_msg.subject = msg['subject'] store_msg.body = msg['body'] store_msg.tags = set(msg['tags']) store_msg.tags.add(u''.join((net['name']))) if msg['recipient'] is None and u'public' not in msg['tags']: log.warn("{net[name]} No recipient (msg_id={msg[id]}), " "adding 'public' tag".format(net=net, msg=msg)) store_msg.tags.add(u'public') if (msg['parent'] is not None and str(msg['parent']) not in transkeys): log.warn('{net[name]} No such parent message ({msg[parent]}, ' 'msg_id={msg[id]}), removing reference.' .format(net=net, msg=msg)) elif msg['parent'] is not None: store_msg.parent = int(transdb[msg['parent']]) if msg['id'] in transkeys: log.warn('{net[name]} dupe (msg_id={msg[id]}) discarded.' .format(net=net, msg=msg)) else: # do not save this message to network, we already received # it from the network, set send_net=False store_msg.save(send_net=False, ctime=to_localtime(msg['ctime'])) with transdb: transdb[msg['id']] = store_msg.idx transkeys.append(msg['id']) log.info('{net[name]} Processed (msg_id={msg[id]}) => {new_id}' .format(net=net, msg=msg, new_id=store_msg.idx)) if 'last' not in net.keys() or int(net['last']) < int(msg['id']): net['last'] = msg['id'] if 'last' in net.keys(): with open(net['last_file'], 'w') as last_fp: last_fp.write(str(net['last'])) return