forked from capedayo/minya_hotomoe
feat: added poll module
This commit is contained in:
parent
4d10a9bd20
commit
26604978bf
13 changed files with 481 additions and 307 deletions
|
@ -1,12 +1,14 @@
|
||||||
from module_interface import ModuleInterface
|
from module_interface import ModuleInterface
|
||||||
|
|
||||||
|
|
||||||
class MyModule(ModuleInterface):
|
class MyModule(ModuleInterface):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.name = "DummyModule1"
|
self.name = "DummyModule1"
|
||||||
self.regex_pattern = None #r"my_pattern"
|
self.regex_pattern = None # r"my_pattern"
|
||||||
|
|
||||||
#print("[Dummy1] DummyModule1 loaded.")
|
# print("[Dummy1] DummyModule1 loaded.")
|
||||||
|
|
||||||
def execute_module(self, ctx):
|
def execute_module(self, ctx):
|
||||||
#print(f"[Dummy1] {self.name} 실행: {ctx}")
|
# print(f"[Dummy1] {self.name} 실행: {ctx}")
|
||||||
pass
|
pass
|
||||||
|
|
29
minya.py
29
minya.py
|
@ -1,5 +1,6 @@
|
||||||
from pyfiglet import Figlet
|
from pyfiglet import Figlet
|
||||||
f = Figlet(font='small')
|
|
||||||
|
f = Figlet(font="small")
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import importlib.util
|
import importlib.util
|
||||||
|
@ -15,6 +16,7 @@ from aiohttp import ClientWebSocketResponse
|
||||||
from mipac.models.notification import NotificationNote
|
from mipac.models.notification import NotificationNote
|
||||||
from mipa.ext.commands.bot import Bot
|
from mipa.ext.commands.bot import Bot
|
||||||
|
|
||||||
|
|
||||||
def load_modules():
|
def load_modules():
|
||||||
module_dir = "modules"
|
module_dir = "modules"
|
||||||
modules = []
|
modules = []
|
||||||
|
@ -29,10 +31,15 @@ def load_modules():
|
||||||
|
|
||||||
for attribute_name in dir(module):
|
for attribute_name in dir(module):
|
||||||
attribute = getattr(module, attribute_name)
|
attribute = getattr(module, attribute_name)
|
||||||
if inspect.isclass(attribute) and issubclass(attribute, ModuleInterface) and attribute != ModuleInterface:
|
if (
|
||||||
|
inspect.isclass(attribute)
|
||||||
|
and issubclass(attribute, ModuleInterface)
|
||||||
|
and attribute != ModuleInterface
|
||||||
|
):
|
||||||
modules.append(attribute())
|
modules.append(attribute())
|
||||||
return modules
|
return modules
|
||||||
|
|
||||||
|
|
||||||
class MiNya(Bot):
|
class MiNya(Bot):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
@ -40,7 +47,8 @@ class MiNya(Bot):
|
||||||
self.__manager = ModuleManager(self)
|
self.__manager = ModuleManager(self)
|
||||||
|
|
||||||
async def _connect_channel(self):
|
async def _connect_channel(self):
|
||||||
await self.router.connect_channel(['main'])
|
await self.router.connect_channel(["main"])
|
||||||
|
|
||||||
async def on_reconnect(self, ws: ClientWebSocketResponse):
|
async def on_reconnect(self, ws: ClientWebSocketResponse):
|
||||||
await self._connect_channel()
|
await self._connect_channel()
|
||||||
|
|
||||||
|
@ -66,27 +74,30 @@ class MiNya(Bot):
|
||||||
async def on_mention(self, notice: NotificationNote):
|
async def on_mention(self, notice: NotificationNote):
|
||||||
print("[Main] Got Mentioned!")
|
print("[Main] Got Mentioned!")
|
||||||
for _, module in self.__manager.modules.items():
|
for _, module in self.__manager.modules.items():
|
||||||
if module.regex_pattern and re.match(module.regex_pattern, notice.note.content):
|
if module.regex_pattern and re.match(
|
||||||
|
module.regex_pattern, notice.note.content
|
||||||
|
):
|
||||||
print("[Main] Regex Matching Module found : ", module.name)
|
print("[Main] Regex Matching Module found : ", module.name)
|
||||||
if await module.execute_module(notice.note):
|
if await module.execute_module(notice.note):
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
print(f.renderText('MiNya V1'))
|
print(f.renderText("MiNya V1"))
|
||||||
print('"MIsskey Networked Yet Ambitious"')
|
print('"MIsskey Networked Yet Ambitious"')
|
||||||
print('')
|
print("")
|
||||||
print("[Main] Minya V1 Bootstap...")
|
print("[Main] Minya V1 Bootstap...")
|
||||||
print("[Main] Loading settings...")
|
print("[Main] Loading settings...")
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
instance = os.environ.get('BOT_INSTANCE')
|
instance = os.environ.get("BOT_INSTANCE")
|
||||||
key = os.environ.get('BOT_KEY')
|
key = os.environ.get("BOT_KEY")
|
||||||
|
|
||||||
if not (instance and key):
|
if not (instance and key):
|
||||||
print("[MAIN] ERR! please check .env or os environment!")
|
print("[MAIN] ERR! please check .env or os environment!")
|
||||||
return
|
return
|
||||||
bot = MiNya()
|
bot = MiNya()
|
||||||
asyncio.run(bot.start(f'wss://{instance}/streaming', key))
|
asyncio.run(bot.start(f"wss://{instance}/streaming", key))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from mipa.ext.commands.bot import Bot
|
from mipa.ext.commands.bot import Bot
|
||||||
|
|
||||||
|
|
||||||
class ModuleInterface:
|
class ModuleInterface:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.name = None
|
self.name = None
|
||||||
|
@ -9,7 +10,7 @@ class ModuleInterface:
|
||||||
|
|
||||||
def set_manager(self, manager):
|
def set_manager(self, manager):
|
||||||
self.manager = manager
|
self.manager = manager
|
||||||
#self.module_ready()
|
# self.module_ready()
|
||||||
|
|
||||||
def get_execute_pattern(self, regex_pattern):
|
def get_execute_pattern(self, regex_pattern):
|
||||||
return self.__regex_pattern
|
return self.__regex_pattern
|
||||||
|
@ -25,7 +26,7 @@ class ModuleInterface:
|
||||||
|
|
||||||
|
|
||||||
class ModuleManager:
|
class ModuleManager:
|
||||||
def __init__(self, main_bot = None):
|
def __init__(self, main_bot=None):
|
||||||
self.modules = {}
|
self.modules = {}
|
||||||
self.bot: (Bot | None) = main_bot
|
self.bot: (Bot | None) = main_bot
|
||||||
|
|
||||||
|
|
|
@ -2,230 +2,232 @@ from module_interface import ModuleInterface
|
||||||
import random
|
import random
|
||||||
|
|
||||||
itemPrefixes = [
|
itemPrefixes = [
|
||||||
'플라티나로 만든',
|
"플라티나로 만든",
|
||||||
'신선한',
|
"신선한",
|
||||||
'최신의',
|
"최신의",
|
||||||
'고대의',
|
"고대의",
|
||||||
'수제',
|
"수제",
|
||||||
'시계장치의',
|
"시계장치의",
|
||||||
'전설의',
|
"전설의",
|
||||||
'구이',
|
"구이",
|
||||||
'날것의',
|
"날것의",
|
||||||
'미냐가 만든',
|
"미냐가 만든",
|
||||||
'포켓 사이즈',
|
"포켓 사이즈",
|
||||||
'사흘 전의',
|
"사흘 전의",
|
||||||
'그 근처의',
|
"그 근처의",
|
||||||
'짭',
|
"짭",
|
||||||
'사용된',
|
"사용된",
|
||||||
'고장난',
|
"고장난",
|
||||||
'시판되는',
|
"시판되는",
|
||||||
'주문제작된',
|
"주문제작된",
|
||||||
'업무용의',
|
"업무용의",
|
||||||
'Microsoft제',
|
"Microsoft제",
|
||||||
'Apple제',
|
"Apple제",
|
||||||
'인류 기술의 결정체인',
|
"인류 기술의 결정체인",
|
||||||
'2021년산',
|
"2021년산",
|
||||||
'500kg정도의',
|
"500kg정도의",
|
||||||
'고오급',
|
"고오급",
|
||||||
'썩은',
|
"썩은",
|
||||||
'인공지능 탑재',
|
"인공지능 탑재",
|
||||||
'블록체인 탑재',
|
"블록체인 탑재",
|
||||||
'반중력',
|
"반중력",
|
||||||
'접이식',
|
"접이식",
|
||||||
'휴대용',
|
"휴대용",
|
||||||
'유전자 재조합',
|
"유전자 재조합",
|
||||||
'돌연변이로 비행 능력이 있는',
|
"돌연변이로 비행 능력이 있는",
|
||||||
'순금으로 만든',
|
"순금으로 만든",
|
||||||
'투명한',
|
"투명한",
|
||||||
'빛나는',
|
"빛나는",
|
||||||
'하트 모양의',
|
"하트 모양의",
|
||||||
'움직이는',
|
"움직이는",
|
||||||
'반으로 잘린',
|
"반으로 잘린",
|
||||||
'USB 커넥터가 달린',
|
"USB 커넥터가 달린",
|
||||||
'지난 날의',
|
"지난 날의",
|
||||||
'저주받은',
|
"저주받은",
|
||||||
'인챈트된',
|
"인챈트된",
|
||||||
'하루치의 비타민이 들어간',
|
"하루치의 비타민이 들어간",
|
||||||
'손을 댄',
|
"손을 댄",
|
||||||
'환상의',
|
"환상의",
|
||||||
'가상의',
|
"가상의",
|
||||||
'원자력',
|
"원자력",
|
||||||
'고도로 훈련받은',
|
"고도로 훈련받은",
|
||||||
'유전자 조작이 아닌',
|
"유전자 조작이 아닌",
|
||||||
'런던 중심부에서 발견된',
|
"런던 중심부에서 발견된",
|
||||||
'이세계의',
|
"이세계의",
|
||||||
'다른 별의',
|
"다른 별의",
|
||||||
'수수께끼의',
|
"수수께끼의",
|
||||||
'시공을 일그러뜨리는',
|
"시공을 일그러뜨리는",
|
||||||
'이상한 소리가 나는',
|
"이상한 소리가 나는",
|
||||||
'무산된',
|
"무산된",
|
||||||
'플라즈마화된',
|
"플라즈마화된",
|
||||||
'충격을 주면 낮은 확률로 폭발하는',
|
"충격을 주면 낮은 확률로 폭발하는",
|
||||||
'주키니로 변신한',
|
"주키니로 변신한",
|
||||||
'가설의',
|
"가설의",
|
||||||
'독이 있는',
|
"독이 있는",
|
||||||
'진짜',
|
"진짜",
|
||||||
'궁극의',
|
"궁극의",
|
||||||
'초코가 들어간',
|
"초코가 들어간",
|
||||||
'악취가 나는',
|
"악취가 나는",
|
||||||
'4차원',
|
"4차원",
|
||||||
'박동하는',
|
"박동하는",
|
||||||
'정체를 알 수 없는',
|
"정체를 알 수 없는",
|
||||||
'네모난',
|
"네모난",
|
||||||
'날뛰는',
|
"날뛰는",
|
||||||
'꿈의',
|
"꿈의",
|
||||||
'어둠의',
|
"어둠의",
|
||||||
'암흑의',
|
"암흑의",
|
||||||
'봉인된',
|
"봉인된",
|
||||||
'죽음의',
|
"죽음의",
|
||||||
'얼어버린',
|
"얼어버린",
|
||||||
'마의',
|
"마의",
|
||||||
'금단의',
|
"금단의",
|
||||||
'홀로그래픽',
|
"홀로그래픽",
|
||||||
'유압식',
|
"유압식",
|
||||||
]
|
]
|
||||||
|
|
||||||
items = [
|
items = [
|
||||||
'가지',
|
"가지",
|
||||||
'토마토',
|
"토마토",
|
||||||
'오이',
|
"오이",
|
||||||
'감자',
|
"감자",
|
||||||
'볶음국수',
|
"볶음국수",
|
||||||
'허리',
|
"허리",
|
||||||
'초밥',
|
"초밥",
|
||||||
'호박',
|
"호박",
|
||||||
'유키치',
|
"유키치",
|
||||||
'금괴',
|
"금괴",
|
||||||
'알루미늄',
|
"알루미늄",
|
||||||
'나트륨',
|
"나트륨",
|
||||||
'마그네슘',
|
"마그네슘",
|
||||||
'플루토늄',
|
"플루토늄",
|
||||||
'작은 금속',
|
"작은 금속",
|
||||||
'우유팩',
|
"우유팩",
|
||||||
'페트병',
|
"페트병",
|
||||||
'쿠키',
|
"쿠키",
|
||||||
'초콜릿',
|
"초콜릿",
|
||||||
'메이드복',
|
"메이드복",
|
||||||
'오렌지',
|
"오렌지",
|
||||||
'니삭스',
|
"니삭스",
|
||||||
'반물질 콘덴서',
|
"반물질 콘덴서",
|
||||||
'입자가속기',
|
"입자가속기",
|
||||||
'마이크로프로세서 (8코어 16스레드)',
|
"마이크로프로세서 (8코어 16스레드)",
|
||||||
'원자력 발전소',
|
"원자력 발전소",
|
||||||
'L4 스위치',
|
"L4 스위치",
|
||||||
'완충 체인',
|
"완충 체인",
|
||||||
'양전자 두뇌',
|
"양전자 두뇌",
|
||||||
'행성',
|
"행성",
|
||||||
'테르민',
|
"테르민",
|
||||||
'충치차',
|
"충치차",
|
||||||
'마운터',
|
"마운터",
|
||||||
'버킷 휠 익스커베이터',
|
"버킷 휠 익스커베이터",
|
||||||
'데몬 코어',
|
"데몬 코어",
|
||||||
'게임보이 어드밴스',
|
"게임보이 어드밴스",
|
||||||
'양자컴퓨터',
|
"양자컴퓨터",
|
||||||
'아나몰픽 렌즈',
|
"아나몰픽 렌즈",
|
||||||
'벽장에서 나온 수수께끼의 생물',
|
"벽장에서 나온 수수께끼의 생물",
|
||||||
'스마트폰',
|
"스마트폰",
|
||||||
'시계',
|
"시계",
|
||||||
'푸딩',
|
"푸딩",
|
||||||
'가브리엘의 나팔',
|
"가브리엘의 나팔",
|
||||||
'맹거의 스펀지',
|
"맹거의 스펀지",
|
||||||
'피젯 스피너',
|
"피젯 스피너",
|
||||||
'초입방체',
|
"초입방체",
|
||||||
'건축물',
|
"건축물",
|
||||||
'에너지 드링크',
|
"에너지 드링크",
|
||||||
'마우스 커서',
|
"마우스 커서",
|
||||||
'안경',
|
"안경",
|
||||||
'참치',
|
"참치",
|
||||||
'쓰레기통',
|
"쓰레기통",
|
||||||
'이쑤시개',
|
"이쑤시개",
|
||||||
'도시락에 들어가는 초록색 칸막이같은 녀석',
|
"도시락에 들어가는 초록색 칸막이같은 녀석",
|
||||||
'나무젓가락',
|
"나무젓가락",
|
||||||
'환기구',
|
"환기구",
|
||||||
'페트병의 뚜껑',
|
"페트병의 뚜껑",
|
||||||
'소파 블럭',
|
"소파 블럭",
|
||||||
'피자',
|
"피자",
|
||||||
'치약',
|
"치약",
|
||||||
'깡통',
|
"깡통",
|
||||||
'열쇠고리',
|
"열쇠고리",
|
||||||
'금발 벽안의 미소녀',
|
"금발 벽안의 미소녀",
|
||||||
'SD카드',
|
"SD카드",
|
||||||
'립 크림',
|
"립 크림",
|
||||||
'초코 없는 초코소라빵',
|
"초코 없는 초코소라빵",
|
||||||
'조류독감',
|
"조류독감",
|
||||||
'자판기',
|
"자판기",
|
||||||
'무거운 것',
|
"무거운 것",
|
||||||
'노트북',
|
"노트북",
|
||||||
'육포',
|
"육포",
|
||||||
'연어 치즈',
|
"연어 치즈",
|
||||||
'다이아몬드',
|
"다이아몬드",
|
||||||
'물체',
|
"물체",
|
||||||
'월석',
|
"월석",
|
||||||
'특이점',
|
"특이점",
|
||||||
'중성자별',
|
"중성자별",
|
||||||
'액체',
|
"액체",
|
||||||
'위성',
|
"위성",
|
||||||
'주키니',
|
"주키니",
|
||||||
'검은 것',
|
"검은 것",
|
||||||
'흰 것',
|
"흰 것",
|
||||||
'빨간 것',
|
"빨간 것",
|
||||||
'동그란 것',
|
"동그란 것",
|
||||||
'네모난 것',
|
"네모난 것",
|
||||||
'카드 모양의 것',
|
"카드 모양의 것",
|
||||||
'기체',
|
"기체",
|
||||||
'연필',
|
"연필",
|
||||||
'지우개',
|
"지우개",
|
||||||
'양날검',
|
"양날검",
|
||||||
'막대 모양의 것',
|
"막대 모양의 것",
|
||||||
'농산물',
|
"농산물",
|
||||||
'메탈 슬라임',
|
"메탈 슬라임",
|
||||||
'문어발',
|
"문어발",
|
||||||
'버섯',
|
"버섯",
|
||||||
'나메코',
|
"나메코",
|
||||||
'호로요이',
|
"호로요이",
|
||||||
'손톱깎기',
|
"손톱깎기",
|
||||||
'귓속말',
|
"귓속말",
|
||||||
'인형',
|
"인형",
|
||||||
'티라노사우르스',
|
"티라노사우르스",
|
||||||
'요로결석',
|
"요로결석",
|
||||||
'엔터 키',
|
"엔터 키",
|
||||||
'항아리',
|
"항아리",
|
||||||
'수은',
|
"수은",
|
||||||
'물',
|
"물",
|
||||||
'토지',
|
"토지",
|
||||||
'대륙',
|
"대륙",
|
||||||
'주사위',
|
"주사위",
|
||||||
'실외기',
|
"실외기",
|
||||||
'유압잭',
|
"유압잭",
|
||||||
'타피오카',
|
"타피오카",
|
||||||
'PSP',
|
"PSP",
|
||||||
'화장지 심지',
|
"화장지 심지",
|
||||||
'골판지 상자',
|
"골판지 상자",
|
||||||
'하니와',
|
"하니와",
|
||||||
'볼펜',
|
"볼펜",
|
||||||
'샤펜',
|
"샤펜",
|
||||||
'원자',
|
"원자",
|
||||||
'우주',
|
"우주",
|
||||||
'소립자',
|
"소립자",
|
||||||
'참기름',
|
"참기름",
|
||||||
'undefined',
|
"undefined",
|
||||||
'None',
|
"None",
|
||||||
'NAN',
|
"NAN",
|
||||||
'[object Object]'
|
"[object Object]",
|
||||||
]
|
]
|
||||||
|
|
||||||
ands = [
|
ands = [
|
||||||
[None, None, '에 빙의한'],
|
[None, None, "에 빙의한"],
|
||||||
[None, None, '에 들어가는'],
|
[None, None, "에 들어가는"],
|
||||||
[None, None, '에 묻힌'],
|
[None, None, "에 묻힌"],
|
||||||
['을', '를', ' 연상시키는'],
|
["을", "를", " 연상시키는"],
|
||||||
[None, None, ' 같은'],
|
[None, None, " 같은"],
|
||||||
['으로', '로', ' 가장한'],
|
["으로", "로", " 가장한"],
|
||||||
[None, None, '에 올려진'],
|
[None, None, "에 올려진"],
|
||||||
[None, None, ' 옆에 있는'],
|
[None, None, " 옆에 있는"],
|
||||||
];
|
]
|
||||||
|
|
||||||
from mipac.models import Note
|
from mipac.models import Note
|
||||||
|
|
||||||
|
|
||||||
class AiTem(ModuleInterface):
|
class AiTem(ModuleInterface):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
@ -242,9 +244,28 @@ class AiTem(ModuleInterface):
|
||||||
def _generate(self):
|
def _generate(self):
|
||||||
item1_sel = random.choice(items)
|
item1_sel = random.choice(items)
|
||||||
con_sel = random.choice(ands)
|
con_sel = random.choice(ands)
|
||||||
item1_comp = self.manager.require("K-Josa").get_func("process_josa")(item1_sel, con_sel[0], con_sel[1]) + con_sel[2]
|
item1_comp = (
|
||||||
|
self.manager.require("K-Josa").get_func("process_josa")(
|
||||||
|
item1_sel, con_sel[0], con_sel[1]
|
||||||
|
)
|
||||||
|
+ con_sel[2]
|
||||||
|
)
|
||||||
|
|
||||||
return random.choice(itemPrefixes) + ' ' + ((item1_comp + ' ' + random.choice(itemPrefixes) + ' ' + random.choice(items)) if random.choice([True, False]) else item1_sel)
|
return (
|
||||||
|
random.choice(itemPrefixes)
|
||||||
|
+ " "
|
||||||
|
+ (
|
||||||
|
(
|
||||||
|
item1_comp
|
||||||
|
+ " "
|
||||||
|
+ random.choice(itemPrefixes)
|
||||||
|
+ " "
|
||||||
|
+ random.choice(items)
|
||||||
|
)
|
||||||
|
if random.choice([True, False])
|
||||||
|
else item1_sel
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
def module_ready(self):
|
def module_ready(self):
|
||||||
print("[Ai-tem] Module Ready.")
|
print("[Ai-tem] Module Ready.")
|
||||||
|
|
|
@ -3,44 +3,43 @@ from mipa.ext import tasks
|
||||||
import random
|
import random
|
||||||
|
|
||||||
Amumals = {
|
Amumals = {
|
||||||
"notes": [
|
"notes": [
|
||||||
"아무말 모듈 테스트 중이에요!",
|
"아무말 모듈 테스트 중이에요!",
|
||||||
"별거 아닌 일에는 '어?' 금지에요!",
|
"별거 아닌 일에는 '어?' 금지에요!",
|
||||||
"미레라도의 아이돌, 미냐에요!",
|
"미레라도의 아이돌, 미냐에요!",
|
||||||
"빙구르르...",
|
"빙구르르...",
|
||||||
"잠이여 물러가세요!",
|
"잠이여 물러가세요!",
|
||||||
"좋아... 이 버튼을 누르면..! 어라..?",
|
"좋아... 이 버튼을 누르면..! 어라..?",
|
||||||
"겍...",
|
"겍...",
|
||||||
"리아님이 안놀아줘요...",
|
"리아님이 안놀아줘요...",
|
||||||
"미레라도? 미래라도? 헷갈려요!",
|
"미레라도? 미래라도? 헷갈려요!",
|
||||||
"배가 고파서 저기 메모리에 굴러다니던 푸딩을 먹었어요!",
|
"배가 고파서 저기 메모리에 굴러다니던 푸딩을 먹었어요!",
|
||||||
"어라라, 분명 뭔가 하려고 했었는데..??",
|
"어라라, 분명 뭔가 하려고 했었는데..??",
|
||||||
"가끔씩은 이웃집에도 놀러가보고 싶어요♪",
|
"가끔씩은 이웃집에도 놀러가보고 싶어요♪",
|
||||||
"피곤하신가요? 오늘도 수고하셨어요!",
|
"피곤하신가요? 오늘도 수고하셨어요!",
|
||||||
"이불 밖은 던전이에요!",
|
"이불 밖은 던전이에요!",
|
||||||
"미냐 안자요",
|
"미냐 안자요",
|
||||||
"옆집에는 좋은 이름을 가진 친구가 있는 것 같아요!",
|
"옆집에는 좋은 이름을 가진 친구가 있는 것 같아요!",
|
||||||
"아이와 친구가 되고 싶어요... 일본어는 못하지만요...",
|
"아이와 친구가 되고 싶어요... 일본어는 못하지만요...",
|
||||||
"코...",
|
"코...",
|
||||||
"리아님 놀아주세요!",
|
"리아님 놀아주세요!",
|
||||||
"저는 심연은 아니지만 여러분을 들여다 볼 수 있어요.",
|
"저는 심연은 아니지만 여러분을 들여다 볼 수 있어요.",
|
||||||
"꾸벅...",
|
"꾸벅...",
|
||||||
"레라님 일하세요!",
|
"레라님 일하세요!",
|
||||||
"집에 가고싶나요? 저도 가고싶어요!",
|
"집에 가고싶나요? 저도 가고싶어요!",
|
||||||
"**로봇이 아닙니다...** 어라? 왜 안 넘어가지죠?",
|
"**로봇이 아닙니다...** 어라? 왜 안 넘어가지죠?",
|
||||||
"엣...",
|
"엣...",
|
||||||
"안에 사람이 갇혔어요! ...농담이에요",
|
"안에 사람이 갇혔어요! ...농담이에요",
|
||||||
"레라님이 쓰러지지 않아",
|
"레라님이 쓰러지지 않아",
|
||||||
"이 건물 여기저기엔 P1이라고 적혀있어요! 무슨 뜻일까요?",
|
"이 건물 여기저기엔 P1이라고 적혀있어요! 무슨 뜻일까요?",
|
||||||
"헤이 시리, 자폭하세요!",
|
"헤이 시리, 자폭하세요!",
|
||||||
"어느날 레라님이 키위 모양 쿠션을 가져왔어요!",
|
"어느날 레라님이 키위 모양 쿠션을 가져왔어요!",
|
||||||
"앗 또 까먹었어..!",
|
"앗 또 까먹었어..!",
|
||||||
"기게-엑",
|
"기게-엑",
|
||||||
"(사악한 웃음)",
|
"(사악한 웃음)",
|
||||||
"하와와..."
|
"하와와...",
|
||||||
]
|
]
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class Amumal(ModuleInterface):
|
class Amumal(ModuleInterface):
|
||||||
|
@ -61,6 +60,14 @@ class Amumal(ModuleInterface):
|
||||||
kjosa = self.manager.require("K-Josa").get_func("process_josa")
|
kjosa = self.manager.require("K-Josa").get_func("process_josa")
|
||||||
|
|
||||||
if random.choice([True, False]):
|
if random.choice([True, False]):
|
||||||
await self.manager.bot.client.note.action.send(random.choice(Amumals["notes"] + [kjosa(aitem, "이", "가") + " 가지고 싶어요...", "오늘 산책 중에 " + kjosa(aitem, "을", "를") + " 봤어요!"]), visibility="home")
|
await self.manager.bot.client.note.action.send(
|
||||||
|
random.choice(
|
||||||
|
Amumals["notes"]
|
||||||
|
+ [
|
||||||
|
kjosa(aitem, "이", "가") + " 가지고 싶어요...",
|
||||||
|
"오늘 산책 중에 " + kjosa(aitem, "을", "를") + " 봤어요!",
|
||||||
|
]
|
||||||
|
),
|
||||||
|
visibility="home",
|
||||||
|
)
|
||||||
print("[Amumal] Sent Amumal!")
|
print("[Amumal] Sent Amumal!")
|
||||||
|
|
||||||
|
|
107
modules/Amumal_poll.py
Normal file
107
modules/Amumal_poll.py
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
from asyncio import sleep
|
||||||
|
from mipa import Note
|
||||||
|
from module_interface import ModuleInterface
|
||||||
|
from mipa.ext import tasks
|
||||||
|
from mipac import ICreatePoll, MiPoll
|
||||||
|
import random
|
||||||
|
|
||||||
|
polls = [
|
||||||
|
['신기해 보이는 것들', '여러분, 어떤 게 가장 신기할 것 같나요?'],
|
||||||
|
['맛있을 것 같은 거', '여러분은 어떤 게 가장 맛있을 것 같아요?'],
|
||||||
|
['무거울 것 같은 것', '이 중에서 어느 게 가장 무거울 것 같나요?'],
|
||||||
|
['갖고 싶은 거', '여러분, 이 중에서 어느 게 가장 갖고 싶으세요?'],
|
||||||
|
['무인도에 가져가고 싶은 것', '여러분은 무인도에 한 가지를 가져갈 수 있다면 어떤 걸 가져가고 싶으세요?'],
|
||||||
|
['집에 장식하고 싶은 것', '여러분은 집에 어떤 장식을 다시나요?'],
|
||||||
|
['사업 아이템', '여러분은 어떤 게 가장 잘 팔릴 것 같아요?'],
|
||||||
|
['내렸으면 하는 것들', '여러분, 다음 중에서 어떤 게 하늘에서 내렸으면 좋겠어요?'],
|
||||||
|
['폰으로 하고 싶은 것', '여러분은 어떤 걸 핸드폰으로 갖고 싶어요?'],
|
||||||
|
['상품화하고 싶은 것', '여러분들은 상품화 하면 어떤 거 할래요?'],
|
||||||
|
['발굴될 만한 것', '여러분은 유적에서 발굴될 것 같은 것은 무엇이라고 생각하시나요?'],
|
||||||
|
['향기가 좋을 것 같은 것', '여러분들은 어떤 게 가장 좋은 향기가 난다고 생각하시나요?'],
|
||||||
|
['뭔가 비쌀 것 같은 것', '여러분은 어떤 게 가장 고가에 거래될 꺼라고 생각하시나요?'],
|
||||||
|
['지구 궤도상에 있을 법한 것', '여러분은 어떤 게 지구 궤도를 떠다닐 것 같다고 생각하세요?'],
|
||||||
|
['선물하고 싶은 것', '여러분은 저에게 어떤 선물을 주고 싶으신가요?'],
|
||||||
|
['선물 받고 싶은 것', '여러분은 어떤 걸 선물로 받고 싶으세요?'],
|
||||||
|
['제가 갖고 있을 것 같은 것', '여러분은 제가 어떤 걸 갖고 있을 것 같나요?'],
|
||||||
|
['유행할 법한 것', '여러분, 어떤 게 유행할 것 같아요?'],
|
||||||
|
['아침밥', '여러분은 아침밥으로 어떤 걸 드시고 싶으신가요?'],
|
||||||
|
['점심밥', '여러분, 점심은 뭐로 드시고 싶으세요?'],
|
||||||
|
['저녁밥', '여러분은 저녁에 어떤 걸 먹고 싶어요?'],
|
||||||
|
['몸에 좋은 것', '여러분은 어떤 게 몸에 좋을 것 같아요?'],
|
||||||
|
['후세에 물려주고 싶은 것', '여러분은 어떤 걸 후세에 물려주고 싶으세요?'],
|
||||||
|
['악기가 될 만한 것', '이 중에서 어떤 걸 악기로 쓸 수 있을까요?'],
|
||||||
|
['부대찌게에 넣을 만한 것', '여러분, 이 중에서 부대찌게에 넣을 만한 건 어떤 게 있을까요?'],
|
||||||
|
['후리카케 대용으로 쓰고 싶은 것', '여러분은 어떤 걸 밥에 뿌리고 싶으세요?'],
|
||||||
|
['자주 보는 것', '여러분, 어떤 걸 자주 보시나요'],
|
||||||
|
['길가에 떨어져 있을 만한 것', '길가에서 주울 수 있는 건 어떤 게 있을까요?'],
|
||||||
|
['미술관에 있을법한 것', '여러분은 이 중에서 어떤 게 미술관에 있을 것 같아요?'],
|
||||||
|
['교실에 있을 것 같은 것', '여러분은 어떤 게 교실에 있을 법한 것 같나요?'],
|
||||||
|
['이모지가 되었으면 하는 것', '이모지가 되었으면 하는 걸 골라주세요!'],
|
||||||
|
['CherryPick 본부에 있을 법한 것', '여러분, CherryPick 본부에는 어떤 게 있을 것 같나요?'],
|
||||||
|
['타는 쓰레기', '이 중에서 어느 게 타는 쓰레기일까요?'],
|
||||||
|
['좋아하는 삼각김밥 맛', '여러분이 좋아하는 삼각김밥 맛은 무엇인가요?']
|
||||||
|
]
|
||||||
|
|
||||||
|
class Amumal(ModuleInterface):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.name = "Amumal_Poll"
|
||||||
|
self.regex_pattern = None
|
||||||
|
|
||||||
|
print("[Amumal_Poll] Random Poll module, Amumal_Poll V1 loaded.")
|
||||||
|
|
||||||
|
def module_ready(self):
|
||||||
|
print("[Amumal_Poll] Module Ready.")
|
||||||
|
self.amumal_task.start()
|
||||||
|
|
||||||
|
@tasks.loop(seconds=(60.0 * 60))
|
||||||
|
async def amumal_task(self):
|
||||||
|
gen_aitem = self.manager.require("Ai-tem").get_func("generate")
|
||||||
|
if random.choice([True, False, False, False, False]):
|
||||||
|
generated_title = random.choice(polls)
|
||||||
|
|
||||||
|
gen_poll = MiPoll(
|
||||||
|
ICreatePoll(
|
||||||
|
expired_after=1000 * 60 * 60,
|
||||||
|
choices=[gen_aitem(), gen_aitem(), gen_aitem(), gen_aitem()],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
sent_note = await self.manager.bot.client.note.action.send(
|
||||||
|
content=generated_title[1], visibility="home", poll=gen_poll
|
||||||
|
)
|
||||||
|
print("[Amumal_Poll] Poll started")
|
||||||
|
await sleep(60 * 60)
|
||||||
|
await self._poll_end(generated_title[0], sent_note)
|
||||||
|
|
||||||
|
async def _poll_end(self, title, p_note: Note):
|
||||||
|
p_choices = (await self.manager.bot.client.note.action.get(p_note.id)).poll.choices
|
||||||
|
kjosa = self.manager.require("K-Josa").get_func("process_josa")
|
||||||
|
|
||||||
|
mostVotedChoice = None
|
||||||
|
for p_choice in p_choices:
|
||||||
|
if mostVotedChoice == None:
|
||||||
|
mostVotedChoice = p_choice
|
||||||
|
continue
|
||||||
|
if p_choice.votes > mostVotedChoice.votes:
|
||||||
|
mostVotedChoice = p_choice
|
||||||
|
|
||||||
|
mostVotedChoices = list(filter(lambda x: x.votes == mostVotedChoice.votes, p_choices))
|
||||||
|
|
||||||
|
if mostVotedChoice.votes == 0:
|
||||||
|
await self.manager.bot.client.note.action.send(
|
||||||
|
content="아무도 투표하지 않았어요... :meow_melt_cry:",
|
||||||
|
visibility="home",
|
||||||
|
renote_id=p_note.id,
|
||||||
|
)
|
||||||
|
elif len(mostVotedChoices) == 1:
|
||||||
|
p_content = mostVotedChoice.text
|
||||||
|
else:
|
||||||
|
p_content = " 그리고 ".join((i.text for i in mostVotedChoices))
|
||||||
|
p_content = kjosa(p_content, "이었", "였")
|
||||||
|
await self.manager.bot.client.note.action.send(
|
||||||
|
cw=f"{title} 설문조사 결과 발표에요!",
|
||||||
|
content=f"결과는 {mostVotedChoice.votes}표의 {p_content}어요.",
|
||||||
|
renote_id=p_note.id,
|
||||||
|
)
|
||||||
|
print("[Amumal_Poll] Poll ended :" + ", ".join((f"{i.text}:{i.votes}" for i in mostVotedChoices)))
|
|
@ -2,6 +2,7 @@ from module_interface import ModuleInterface
|
||||||
from mipa.ext import tasks
|
from mipa.ext import tasks
|
||||||
import random
|
import random
|
||||||
|
|
||||||
|
|
||||||
class Birthday(ModuleInterface):
|
class Birthday(ModuleInterface):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
@ -16,5 +17,5 @@ class Birthday(ModuleInterface):
|
||||||
|
|
||||||
@tasks.loop(seconds=600.0)
|
@tasks.loop(seconds=600.0)
|
||||||
async def birthday_task(self):
|
async def birthday_task(self):
|
||||||
#awa
|
# awa
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from module_interface import ModuleInterface
|
from module_interface import ModuleInterface
|
||||||
from mipac.models import Note
|
from mipac.models import Note
|
||||||
|
|
||||||
|
|
||||||
class Follow(ModuleInterface):
|
class Follow(ModuleInterface):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from module_interface import ModuleInterface
|
from module_interface import ModuleInterface
|
||||||
from mipac.models import Note
|
from mipac.models import Note
|
||||||
|
|
||||||
|
|
||||||
class Friend(ModuleInterface):
|
class Friend(ModuleInterface):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
@ -15,7 +16,9 @@ class Friend(ModuleInterface):
|
||||||
print("[Friend] Friend DB system, Friend V1 loaded.")
|
print("[Friend] Friend DB system, Friend V1 loaded.")
|
||||||
|
|
||||||
async def execute_module(self, ctx: Note):
|
async def execute_module(self, ctx: Note):
|
||||||
await ctx.api.action.reply("1" if await self._is_friend_async(ctx.author.id) else "0")
|
await ctx.api.action.reply(
|
||||||
|
"1" if await self._is_friend_async(ctx.author.id) else "0"
|
||||||
|
)
|
||||||
|
|
||||||
def _dec_like(self, userid: str):
|
def _dec_like(self, userid: str):
|
||||||
pass
|
pass
|
||||||
|
@ -24,14 +27,16 @@ class Friend(ModuleInterface):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _get_like(self, userid: str):
|
def _get_like(self, userid: str):
|
||||||
return self._get_db(self.Name, userid)
|
return self._get_db(self.name, userid)["like"]
|
||||||
|
|
||||||
async def _is_friend_async(self, userid: str):
|
async def _is_friend_async(self, userid: str):
|
||||||
target = await self.manager.bot.user.api.action.get(userid)
|
target = await self.manager.bot.user.api.action.get(userid)
|
||||||
return target.is_followed and target.is_following
|
return target.is_followed and target.is_following
|
||||||
|
|
||||||
def module_ready(self):
|
def module_ready(self):
|
||||||
self._get_db = self.manager.require("MinyaDB").get_func("get_module_db")
|
if self.manager != None:
|
||||||
self._set_db = self.manager.require("MinyaDB").get_func("set_module_db")
|
self._get_db = self.manager.require("MinyaDB").get_func("get_module_db")
|
||||||
|
self._set_db = self.manager.require("MinyaDB").get_func("set_module_db")
|
||||||
|
else:
|
||||||
|
raise (Exception("Couldn't find manager"))
|
||||||
print("[Friend] Module Ready.")
|
print("[Friend] Module Ready.")
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
from module_interface import ModuleInterface
|
from module_interface import ModuleInterface
|
||||||
|
|
||||||
from mipac.models import Note
|
from mipac.models import Note
|
||||||
|
|
||||||
|
|
||||||
class KJosa(ModuleInterface):
|
class KJosa(ModuleInterface):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
@ -14,7 +16,18 @@ class KJosa(ModuleInterface):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _process(self, w, t, f):
|
def _process(self, w, t, f):
|
||||||
return (w + ((t if ((ord(w[-1])- 44032) % 28 != 0) else f ) if (44032 <= ord(w[-1]) <= 55203) else f"{t}({f})")) if (t and f) else w
|
return (
|
||||||
|
(
|
||||||
|
w
|
||||||
|
+ (
|
||||||
|
(t if ((ord(w[-1]) - 44032) % 28 != 0) else f)
|
||||||
|
if (44032 <= ord(w[-1]) <= 55203)
|
||||||
|
else f"{t}({f})"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if (t and f)
|
||||||
|
else w
|
||||||
|
)
|
||||||
|
|
||||||
def module_ready(self):
|
def module_ready(self):
|
||||||
print("[K-josa] Module Ready.")
|
print("[K-josa] Module Ready.")
|
||||||
|
|
|
@ -2,6 +2,7 @@ from module_interface import ModuleInterface
|
||||||
from mipac.models import Note
|
from mipac.models import Note
|
||||||
import random
|
import random
|
||||||
|
|
||||||
|
|
||||||
class MConch(ModuleInterface):
|
class MConch(ModuleInterface):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
|
@ -3,6 +3,8 @@ from pupdb.core import PupDB
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from mipac.models import Note
|
from mipac.models import Note
|
||||||
|
|
||||||
|
|
||||||
class MinyaDB(ModuleInterface):
|
class MinyaDB(ModuleInterface):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import re
|
import re
|
||||||
import asyncio
|
import asyncio
|
||||||
from module_interface import ModuleInterface
|
from module_interface import ModuleInterface
|
||||||
|
|
||||||
|
|
||||||
class Timer(ModuleInterface):
|
class Timer(ModuleInterface):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
@ -13,15 +15,15 @@ class Timer(ModuleInterface):
|
||||||
print(f"[Timer] Got Timer Related Message : {ctx.content}")
|
print(f"[Timer] Got Timer Related Message : {ctx.content}")
|
||||||
|
|
||||||
text = ctx.content
|
text = ctx.content
|
||||||
seconds_query = re.search(r'([0-9]+)초', text)
|
seconds_query = re.search(r"([0-9]+)초", text)
|
||||||
minutes_query = re.search(r'([0-9]+)분', text)
|
minutes_query = re.search(r"([0-9]+)분", text)
|
||||||
hours_query = re.search(r'([0-9]+)(시간)', text)
|
hours_query = re.search(r"([0-9]+)(시간)", text)
|
||||||
|
|
||||||
seconds = int(seconds_query.group(1)) if seconds_query else 0
|
seconds = int(seconds_query.group(1)) if seconds_query else 0
|
||||||
minutes = int(minutes_query.group(1)) if minutes_query else 0
|
minutes = int(minutes_query.group(1)) if minutes_query else 0
|
||||||
hours = int(hours_query.group(1)) if hours_query else 0
|
hours = int(hours_query.group(1)) if hours_query else 0
|
||||||
|
|
||||||
if ((seconds + minutes + hours) == 0):
|
if (seconds + minutes + hours) == 0:
|
||||||
await ctx.api.action.reply("올바른 값이 아니에요...")
|
await ctx.api.action.reply("올바른 값이 아니에요...")
|
||||||
|
|
||||||
time = (seconds) + (60 * minutes) + (60 * 60 * hours)
|
time = (seconds) + (60 * minutes) + (60 * 60 * hours)
|
||||||
|
|
Loading…
Reference in a new issue