From ea7f48011c34fdaec7e91af7eb373c8174e439e6 Mon Sep 17 00:00:00 2001
From: Kyomotoi <1172294279@qq.com>
Date: Tue, 4 May 2021 14:27:56 +0800
Subject: =?UTF-8?q?=E2=9C=A8=F0=9F=90=9B=20=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

新增:老婆!
新增:涩图

修复:manage中出现的bug

优化:nsfw不再用float,换为int
---
 ATRI/plugins/utils/data_source.py | 111 ++++++++++++++++++++++++--------------
 1 file changed, 72 insertions(+), 39 deletions(-)

(limited to 'ATRI/plugins/utils/data_source.py')

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)])
-- 
cgit v1.2.3