-
Notifications
You must be signed in to change notification settings - Fork 0
/
danny_formats.py
113 lines (83 loc) · 3.03 KB
/
danny_formats.py
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"""
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
This file was sourced from [RoboDanny](https://github.com/Rapptz/RoboDanny).
Written by @danny on Discord
Taken from https://github.com/Rapptz/RoboDanny/blob/rewrite/cogs/utils/formats.py
"""
from __future__ import annotations
import datetime
from typing import Any, Iterable, Optional, Sequence
class plural:
def __init__(self, value: int):
self.value: int = value
def __format__(self, format_spec: str) -> str:
v = self.value
singular, _, plural = format_spec.partition("|")
plural = plural or f"{singular}s"
if abs(v) != 1:
return f"{v} {plural}"
return f"{v} {singular}"
def human_join(seq: Sequence[str], delim: str = ", ", final: str = "or") -> str:
size = len(seq)
if size == 0:
return ""
if size == 1:
return seq[0]
if size == 2:
return f"{seq[0]} {final} {seq[1]}"
return delim.join(seq[:-1]) + f" {final} {seq[-1]}"
class TabularData:
def __init__(self):
self._widths: list[int] = []
self._columns: list[str] = []
self._rows: list[list[str]] = []
def set_columns(self, columns: list[str]):
self._columns = columns
self._widths = [len(c) + 2 for c in columns]
def add_row(self, row: Iterable[Any]) -> None:
rows = [str(r) for r in row]
self._rows.append(rows)
for index, element in enumerate(rows):
width = len(element) + 2
if width > self._widths[index]:
self._widths[index] = width
def add_rows(self, rows: Iterable[Iterable[Any]]) -> None:
for row in rows:
self.add_row(row)
def render(self) -> str:
"""Renders a table in rST format.
Example:
+-------+-----+
| Name | Age |
+-------+-----+
| Alice | 24 |
| Bob | 19 |
+-------+-----+
"""
sep = "+".join("-" * w for w in self._widths)
sep = f"+{sep}+"
to_draw = [sep]
def get_entry(d):
elem = "|".join(f"{e:^{self._widths[i]}}" for i, e in enumerate(d))
return f"|{elem}|"
to_draw.append(get_entry(self._columns))
to_draw.append(sep)
for row in self._rows:
to_draw.append(get_entry(row))
to_draw.append(sep)
return "\n".join(to_draw)
def format_dt(dt: datetime.datetime, style: Optional[str] = None) -> str:
if dt.tzinfo is None:
dt = dt.replace(tzinfo=datetime.timezone.utc)
if style is None:
return f"<t:{int(dt.timestamp())}>"
return f"<t:{int(dt.timestamp())}:{style}>"
def tick(opt: Optional[bool], /) -> str:
lookup = {
True: "<:greenTick:330090705336664065>",
False: "<:redTick:330090723011592193>",
None: "<:greyTick:563231201280917524>",
}
return lookup.get(opt, "<:redTick:330090723011592193>")