diff --git a/README.md b/README.md index b3fe9a6..db495ef 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ The CLI bard relies on your terminal using a font patched with the "Powerline" characters. The recommended fonts are the ones from the [Nerd font project](https://www.nerdfonts.com/). +You may also need to install the `libgirepository-2.0-dev` on your system. + Usage ===== diff --git a/pyproject.toml b/pyproject.toml index b959cb2..3ca614c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,15 +1,30 @@ -[tool.poetry] +[project] name = "clibard" version = "0.1.0" description = "See all your notifications in the terminal" -authors = ["nojhan "] +authors = [ + { name = "nojhan", email = "nojhan@nojhan.net" }, +] readme = "README.md" -[tool.poetry.dependencies] -python = "^3.11" -faker = "^0.7.4" -humanize = "^4.11" -rich = "^13.9" -dbus-python = "^1.3" -PyGObject = "^3.50" # You may need to install the system package for libgirepository1.0-dev +requires-python = ">3.11" +dependencies = [ + "faker>=0.7.4", + "humanize>=4.11", + "rich>=13.9", + "dbus-python>=1.3", + "PyGObject>=3.50", # You may need to install the system package for libgirepository-2.0-dev +] + +[project.scripts] +clibard = "clibard.clibard:main" + + +[build-system] +requires = ["setuptools>=68", "wheel"] +build-backend = "setuptools.build_meta" + +[tool.setuptools.packages.find] +where = ["src"] +include = ["clibard"] diff --git a/src/clibard/clibard.py b/src/clibard/clibard.py index 0f1fb8f..45d05c8 100755 --- a/src/clibard/clibard.py +++ b/src/clibard/clibard.py @@ -3,9 +3,10 @@ import copy import signal import datetime +import humanize import collections -import humanize +import rich from rich.console import Console import dbus @@ -149,6 +150,14 @@ class Message: "body": 242, } + # 🚨🚩🚧🛎 🛈 🏲 🏴📌📳🗨 🗩 🗬 🗭 🗮 🗯 🧭⚠⚲✎ � ❓❔︖🯄 + self.icons = { + "low": "🛈 ", + "normal": "🗨 ", + "critical": "🚨", + "unknown": "🯄 ", + } + self._style = {} for k in self.color: self._style[k] = f"color({self.color[k]})" @@ -200,6 +209,19 @@ class Message: self.last_color = f"{self.style(key)}" + def auto_fg(self, bg): + # Automated black or white foreground. + if Color.ansi_lightness(bg) >= 50: + return "black" + else: + return "white" + + def hash_color(self, text, colors = None): + if not colors: + return hash(text) % 256 + else: + return colors[hash(text) % len(colors)] + class MessageLine(Message): def print_on(self, console = None, end = ""): @@ -235,6 +257,37 @@ class MessageParagraph(Message): return len(hdate) + len(self.app) + len(self.summary) + len(self.body) + 6 +class MessageBox(Message): + def print_on(self, console = None, end = ""): + hdate = self.date.strftime("%Y-%m-%d %H:%M") + if console != None: + # summ_color = f"{self.auto_fg(FIXME)} on color({self.color[self.urgency]})" + body_color = f"color({self.color['summary_'+self.urgency]})" + + bg = self.hash_color(self.summary) + sfg = f"{self.auto_fg(bg)} on color({bg})" + sfgi = f"color({bg})" + summ = f"─[{sfgi}][/][{sfg}]{self.summary}[/][{sfgi}][/]─" + + title = f"{self.icons[self.urgency]} {summ} {self.app}" + # title = f"[{summ_color}]{self.summary}[/]─ {self.app}" + + bs = self.hash_color(self.app) + + box = rich.panel.Panel( + f"[{body_color}]{self.body}[/]", + title=title, + title_align="left", + # subtitle = self.icons[self.urgency], + # subtitle_align = "left", + border_style=f"color({bs})", + safe_box = False, + ) + console.print(box) + + return len(hdate) + len(self.app) + len(self.summary) + len(self.body) + 6 + + class Broker: def __init__(self, max_msg = 100, bounds = "", msg_cls = Message): @@ -361,7 +414,7 @@ def test_messages(nb = 7): return notifs -if __name__ == "__main__": +def main(): import sys import argparse @@ -382,8 +435,8 @@ if __name__ == "__main__": if asked.layout[0] == "h": broker = HorizontalBroker(bounds = "><") elif asked.layout[0] == "v": - broker = VerticalBroker(bounds = "><") - notifs = test_messages(int(sys.argv[2])) + broker = VerticalBroker(bounds = "><", msg_cls=MessageBox) + notifs = test_messages(int(asked.test)) for notif in notifs: broker.receive(None, notif) print("\n", end="") @@ -391,7 +444,7 @@ if __name__ == "__main__": elif asked.send: import os import time - notifs = test_messages(int(sys.argv[2])) + notifs = test_messages(int(asked.send)) for notif in notifs: m = Message(notif) os.system(f"""notify-send "{m.summary}" "{m.body}" -u {m.urgency}""") @@ -402,5 +455,9 @@ if __name__ == "__main__": broker.run() elif asked.layout[0] == "v": - broker = VerticalBroker() + broker = VerticalBroker(msg_cls=MessageBox) broker.run() + + +if __name__ == "__main__": + main()