view sat_frontends/jp/ @ 2905:d9491cb81726

jp (common): `publish` is now a boolean
author Goffi <>
date Wed, 10 Apr 2019 22:15:29 +0200
parents 003b8b4b56a7
children ab2696e34d29
line wrap: on
line source

#! /usr/bin/python
# -*- coding: utf-8 -*-

# jp: a SàT command line tool
# Copyright (C) 2009-2019 Jérôme Poisson (

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <>.
"""Standard outputs"""

from import Const as C
from import jid
from import ANSI as A
from import date_utils
import json

__outputs__ = ["Simple", "Json"]
SIMPLE = u"simple"
JSON = u"json"
JSON_RAW = u"json_raw"

class Simple(object):
    """Default outputs"""

    def __init__(self, host): = host
        host.register_output(C.OUTPUT_TEXT, SIMPLE, self.simple_print)
        host.register_output(C.OUTPUT_LIST, SIMPLE, self.list)
        host.register_output(C.OUTPUT_DICT, SIMPLE, self.dict)
        host.register_output(C.OUTPUT_LIST_DICT, SIMPLE, self.list_dict)
        host.register_output(C.OUTPUT_DICT_DICT, SIMPLE, self.dict_dict)
        host.register_output(C.OUTPUT_MESS, SIMPLE, self.messages)
        host.register_output(C.OUTPUT_COMPLEX, SIMPLE, self.simple_print)

    def simple_print(self, data):

    def list(self, data):"\n".join(data))

    def dict(self, data, indent=0, header_color=C.A_HEADER):
        options ={u"no-header"}, options)
        show_header = not u"no-header" in options
        for k, v in data.iteritems():
            if show_header:
                header = A.color(header_color, k) + u": "
                header = u""

                        indent=indent * u" ", header=header, value=v

    def list_dict(self, data):
        for idx, datum in enumerate(data):
            if idx:

    def dict_dict(self, data):
        for key, sub_dict in data.iteritems():
  , key))
            self.dict(sub_dict, indent=4, header_color=C.A_SUBHEADER)

    def messages(self, data):
        # TODO: handle lang, and non chat message (normal, headline)
        for mess_data in data:
            (uid, timestamp, from_jid, to_jid, message, subject, mess_type,
             extra) = mess_data
            time_str = date_utils.date_fmt(timestamp, u"auto_day",
            from_jid = jid.JID(from_jid)
            if mess_type == C.MESS_TYPE_GROUPCHAT:
                nick = from_jid.resource
                nick = from_jid.node

            if is not None and == from_jid.bare:
                nick_color = A.BOLD + A.FG_BLUE
                nick_color = A.BOLD + A.FG_YELLOW
            message = message.values()[0] if message else u""

                A.FG_CYAN, u'['+time_str+u'] ',
                nick_color, nick, A.RESET, A.BOLD, u'> ',
                A.RESET, message))

class Json(object):
    """outputs in json format"""

    def __init__(self, host): = host
        host.register_output(C.OUTPUT_TEXT, JSON, self.dump)
        host.register_output(C.OUTPUT_LIST, JSON, self.dump_pretty)
        host.register_output(C.OUTPUT_LIST, JSON_RAW, self.dump)
        host.register_output(C.OUTPUT_DICT, JSON, self.dump_pretty)
        host.register_output(C.OUTPUT_DICT, JSON_RAW, self.dump)
        host.register_output(C.OUTPUT_LIST_DICT, JSON, self.dump_pretty)
        host.register_output(C.OUTPUT_LIST_DICT, JSON_RAW, self.dump)
        host.register_output(C.OUTPUT_DICT_DICT, JSON, self.dump_pretty)
        host.register_output(C.OUTPUT_DICT_DICT, JSON_RAW, self.dump)
        host.register_output(C.OUTPUT_MESS, JSON, self.dump_pretty)
        host.register_output(C.OUTPUT_MESS, JSON_RAW, self.dump)
        host.register_output(C.OUTPUT_COMPLEX, JSON, self.dump_pretty)
        host.register_output(C.OUTPUT_COMPLEX, JSON_RAW, self.dump)

    def dump(self, data):, default=str))

    def dump_pretty(self, data):, indent=4, default=str))