summaryrefslogtreecommitdiff
path: root/ATRI/plugins/utils/data_source.py
diff options
context:
space:
mode:
authorKyomotoi <[email protected]>2021-05-04 14:27:56 +0800
committerKyomotoi <[email protected]>2021-05-04 14:27:56 +0800
commitea7f48011c34fdaec7e91af7eb373c8174e439e6 (patch)
treee4f14eaacde37774d49e7f98ac1ff4635049d80a /ATRI/plugins/utils/data_source.py
parent07a7e41f72cfa9dfd207a04445f4aa5b0b6fa3ce (diff)
downloadATRI-ea7f48011c34fdaec7e91af7eb373c8174e439e6.tar.gz
ATRI-ea7f48011c34fdaec7e91af7eb373c8174e439e6.tar.bz2
ATRI-ea7f48011c34fdaec7e91af7eb373c8174e439e6.zip
✨🐛 更新
新增:老婆! 新增:涩图 修复:manage中出现的bug 优化:nsfw不再用float,换为int
Diffstat (limited to 'ATRI/plugins/utils/data_source.py')
-rw-r--r--ATRI/plugins/utils/data_source.py111
1 files changed, 72 insertions, 39 deletions
diff --git a/ATRI/plugins/utils/data_source.py b/ATRI/plugins/utils/data_source.py
index 4ef46a3..98b2b37 100644
--- a/ATRI/plugins/utils/data_source.py
+++ b/ATRI/plugins/utils/data_source.py
@@ -1,46 +1,47 @@
import re
-import random
from math import floor
-from typing import Union
+import jieba.posseg as pseg
+from typing import Union, Optional
+from random import random, choice, randint
def roll_dice(par: str) -> str:
result = 0
- proc = ""
+ proc = ''
proc_list = []
p = par.split("+")
-
+
for i in p:
args = re.findall(r"(\d{0,10})(?:(d)(\d{1,10}))", i)
args = list(args[0])
-
+
args[0] = args[0] or 1
if int(args[0]) >= 5000 or int(args[2]) >= 5000:
return "阿...好大......"
-
+
for a in range(1, int(args[0]) + 1):
- rd = random.randint(1, int(args[2]))
+ rd = randint(1, int(args[2]))
result = result + rd
-
+
if len(proc_list) <= 10:
proc_list.append(rd)
-
+
if len(proc_list) <= 10:
proc += "+".join(map(str, proc_list))
elif len(proc_list) > 10:
proc += "太长了不展示了就酱w"
else:
proc += str(result)
-
+
result = f"{par}=({proc})={result}"
return result
class Encrypt:
- cr = "ĀāĂ㥹ÀÁÂÃÄÅ"
- cc = "ŢţŤťŦŧṪṫṬṭṮṯṰṱ"
- cn = "ŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟɌɍⱤɽᵲᶉɼɾᵳʀRr"
- cb = "ĨĩĪīĬĭĮįİı"
+ cr = 'ĀāĂ㥹ÀÁÂÃÄÅ'
+ cc = 'ŢţŤťŦŧṪṫṬṭṮṯṰṱ'
+ cn = 'ŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟɌɍⱤɽᵲᶉɼɾᵳʀRr'
+ cb = 'ĨĩĪīĬĭĮįİı'
sr = len(cr)
sc = len(cc)
@@ -55,7 +56,7 @@ class Encrypt:
def _encodeByte(self, i) -> Union[str, None]:
if i > 0xFF:
- raise ValueError("ERROR! at/ri overflow")
+ raise ValueError('ERROR! at/ri overflow')
if i > 0x7F:
i = i & 0x7F
@@ -65,7 +66,7 @@ class Encrypt:
def _encodeShort(self, i) -> str:
if i > 0xFFFF:
- raise ValueError("ERROR! atri overflow")
+ raise ValueError('ERROR! atri overflow')
reverse = False
if i > 0x7FFF:
@@ -75,15 +76,17 @@ class Encrypt:
char = [
self._div(i, self.scnb),
self._div(i % self.scnb, self.snb),
- self._div(i % self.snb, self.sb),
- i % self.sb,
+ self._div(i % self.snb, self.sb), i % self.sb
+ ]
+ char = [
+ self.cr[char[0]], self.cc[char[1]], self.cn[char[2]],
+ self.cb[char[3]]
]
- char = [self.cr[char[0]], self.cc[char[1]], self.cn[char[2]], self.cb[char[3]]]
if reverse:
return char[2] + char[3] + char[0] + char[1]
- return "".join(char)
+ return ''.join(char)
def _decodeByte(self, c) -> int:
nb = False
@@ -91,11 +94,12 @@ class Encrypt:
if idx[0] < 0 or idx[1] < 0:
idx = [self.cn.index(c[0]), self.cb.index(c[1])]
nb = True
- raise ValueError("ERROR! at/ri overflow")
+ raise ValueError('ERROR! at/ri overflow')
- result = idx[0] * self.sb + idx[1] if nb else idx[0] * self.sc + idx[1]
+ result = idx[0] * self.sb + idx[1] \
+ if nb else idx[0] * self.sc + idx[1]
if result > 0x7F:
- raise ValueError("ERROR! at/ri overflow")
+ raise ValueError('ERROR! at/ri overflow')
return result | 0x80 if nb else 0
@@ -106,22 +110,23 @@ class Encrypt:
self.cr.index(c[0]),
self.cc.index(c[1]),
self.cn.index(c[2]),
- self.cb.index(c[3]),
+ self.cb.index(c[3])
]
else:
idx = [
self.cr.index(c[2]),
self.cc.index(c[3]),
self.cn.index(c[0]),
- self.cb.index(c[1]),
+ self.cb.index(c[1])
]
if idx[0] < 0 or idx[1] < 0 or idx[2] < 0 or idx[3] < 0:
- raise ValueError("ERROR! not atri")
+ raise ValueError('ERROR! not atri')
- result = idx[0] * self.scnb + idx[1] * self.snb + idx[2] * self.sb + idx[3]
+ result = idx[0] * self.scnb + idx[1] * self.snb + idx[
+ 2] * self.sb + idx[3]
if result > 0x7FFF:
- raise ValueError("ERROR! atri overflow")
+ raise ValueError('ERROR! atri overflow')
result |= 0x8000 if reverse else 0
return result
@@ -134,36 +139,64 @@ class Encrypt:
if len(b) & 1 == 1:
result.append(self._encodeByte(b[-1]))
- return "".join(result)
+ return ''.join(result)
- def encode(self, s: str, encoding: str = "utf-8"):
+ def encode(self, s: str, encoding: str = 'utf-8'):
if not isinstance(s, str):
- raise ValueError("Please enter str instead of other")
+ raise ValueError('Please enter str instead of other')
return self._encodeBytes(s.encode(encoding))
def _decodeBytes(self, s: str):
if not isinstance(s, str):
- raise ValueError("Please enter str instead of other")
+ raise ValueError('Please enter str instead of other')
if len(s) & 1:
- raise ValueError("ERROR length")
+ raise ValueError('ERROR length')
result = []
for i in range(0, (len(s) >> 2)):
- result.append(bytes([self._decodeShort(s[i * 4 : i * 4 + 4]) >> 8]))
- result.append(bytes([self._decodeShort(s[i * 4 : i * 4 + 4]) & 0xFF]))
+ result.append(bytes([self._decodeShort(s[i * 4:i * 4 + 4]) >> 8]))
+ result.append(bytes([
+ self._decodeShort(s[i * 4:i * 4 + 4]) & 0xFF]))
if (len(s) & 2) == 2:
result.append(bytes([self._decodeByte(s[-2:])]))
- return b"".join(result)
+ return b''.join(result)
- def decode(self, s: str, encoding: str = "utf-8") -> str:
+ def decode(self, s: str, encoding: str = 'utf-8') -> str:
if not isinstance(s, str):
- raise ValueError("Please enter str instead of other")
+ raise ValueError('Please enter str instead of other')
try:
return self._decodeBytes(s).decode(encoding)
except UnicodeDecodeError:
- raise ValueError("Decoding failed")
+ raise ValueError('Decoding failed')
+
+
+class Yinglish:
+ @staticmethod
+ def _to_ying(x, y, ying) -> str:
+ if random() > ying:
+ return x
+ if x in [',', '。']:
+ return str(choice(['..', '...', '....', '......']))
+ if x in ['!', '!']:
+ return "❤"
+ if len(x) > 1 and random() < 0.5:
+ return str(choice([
+ f"{x[0]}..{x}", f"{x[0]}...{x}",
+ f"{x[0]}....{x}", f"{x[0]}......{x}"
+ ]))
+ else:
+ if y == "n" and random() < 0.5:
+ x = "〇" * len(x)
+ return str(choice([
+ f"...{x}", f"....{x}",
+ f".....{x}", f"......{x}"
+ ]))
+
+ @classmethod
+ def deal(cls, text, ying: Optional[float] = 0.5) -> str:
+ return "".join([cls._to_ying(x, y, ying) for x, y in pseg.cut(text)])