summaryrefslogtreecommitdiff
path: root/vdstatus
blob: e5d8cf6a2dbf03802533bd6c1d6dc11aa93449b2 (plain)
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
#!/usr/bin/python3
import argparse
import importlib
import json
import os
import sys
import time
import yaml


DEFAULT_CONFIG = os.path.join(os.environ['HOME'], '.config/vdstatus/conf.yaml')
DEFAULTS = {
    'output_format': 'term',
    'output_freq': 1,
    'plugins': [{'name': 'date'}]
}


def parse_arguments():
    desc = ('A simple i3status replacement, '
            'and more. Warning: WIP, may be broken.')
    parser = argparse.ArgumentParser(description=desc)
    parser.add_argument('-c', '--conf', default=DEFAULT_CONFIG,
                        help='configuration file')
    return parser.parse_args()


class PluginRunner:
    def __init__(self, config_file=DEFAULT_CONFIG):
        self.conf = dict()
        self.conf.update(DEFAULTS)
        with open(config_file) as config_data:
            self.conf.update(yaml.safe_load(config_data))
        self.plugins_loaded = list()
        self.format_output = self.format_term
        for plugin in self.conf['plugins']:
            mod = importlib.import_module('.' + plugin['name'], 'plugins')
            thread_object = mod.PluginThread(plugin)
            self.plugins_loaded.append(thread_object)

    def start(self):
        if self.conf['output_format'] == 'i3':
            print('{"version":1}\n[', flush=True)
            self.format_output = self.format_i3wm
        for plugin in self.plugins_loaded:
            plugin.start()

    def query(self):
        outputs = list()
        for plugin in self.plugins_loaded:
            if \
               not plugin.conf['hide_ok'] or \
               not plugin.hide:
                outputs.append(plugin.status)
        print(self.format_output(outputs), flush=True)

    def run(self):
        while True:
            try:
                self.query()
                time.sleep(self.conf['output_freq'])
            except (KeyboardInterrupt, SystemExit):
                sys.exit()

    @staticmethod
    def format_i3wm(inputs):
        return json.dumps(inputs, ensure_ascii=False) + ','

    @staticmethod
    def format_term(inputs):
        return_info = list()
        for item in inputs:
            return_info.append(item['full_text'])
        return ' \033[1m|\033[0m '.join(return_info)


def main():
    args = parse_arguments()
    plugin_runner = PluginRunner(args.conf)
    plugin_runner.start()
    time.sleep(0.1)
    plugin_runner.run()


if __name__ == '__main__':
    main()