feat: added poll module

This commit is contained in:
Soumt Nam 2023-10-03 11:01:27 +09:00
parent 4d10a9bd20
commit 26604978bf
No known key found for this signature in database
GPG key ID: 5F46B099DCBCA8CE
13 changed files with 481 additions and 307 deletions

View file

@ -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

View file

@ -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()

View file

@ -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

View file

@ -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.")

View file

@ -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
View 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)))

View file

@ -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

View file

@ -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__()

View file

@ -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.")

View file

@ -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.")

View file

@ -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__()

View file

@ -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__()

View file

@ -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)