forked from capedayo/minya_hotomoe
initial
This commit is contained in:
commit
6835bf8fb0
10 changed files with 693 additions and 0 deletions
180
.gitignore
vendored
Normal file
180
.gitignore
vendored
Normal file
|
@ -0,0 +1,180 @@
|
||||||
|
# Created by https://www.toptal.com/developers/gitignore/api/python,dotenv
|
||||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=python,dotenv
|
||||||
|
|
||||||
|
### dotenv ###
|
||||||
|
.env
|
||||||
|
|
||||||
|
### Python ###
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
share/python-wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.nox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
*.py,cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
cover/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
db.sqlite3
|
||||||
|
db.sqlite3-journal
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
.pybuilder/
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# IPython
|
||||||
|
profile_default/
|
||||||
|
ipython_config.py
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
# For a library or package, you might want to ignore these files since the code is
|
||||||
|
# intended to run in multiple environments; otherwise, check them in:
|
||||||
|
# .python-version
|
||||||
|
|
||||||
|
# pipenv
|
||||||
|
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||||
|
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||||
|
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||||
|
# install all needed dependencies.
|
||||||
|
#Pipfile.lock
|
||||||
|
|
||||||
|
# poetry
|
||||||
|
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||||
|
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||||
|
# commonly ignored for libraries.
|
||||||
|
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||||
|
#poetry.lock
|
||||||
|
|
||||||
|
# pdm
|
||||||
|
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||||
|
#pdm.lock
|
||||||
|
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||||
|
# in version control.
|
||||||
|
# https://pdm.fming.dev/#use-with-ide
|
||||||
|
.pdm.toml
|
||||||
|
|
||||||
|
.vim/
|
||||||
|
|
||||||
|
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||||
|
__pypackages__/
|
||||||
|
|
||||||
|
# Celery stuff
|
||||||
|
celerybeat-schedule
|
||||||
|
celerybeat.pid
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
.dmypy.json
|
||||||
|
dmypy.json
|
||||||
|
|
||||||
|
# Pyre type checker
|
||||||
|
.pyre/
|
||||||
|
|
||||||
|
# pytype static type analyzer
|
||||||
|
.pytype/
|
||||||
|
|
||||||
|
# Cython debug symbols
|
||||||
|
cython_debug/
|
||||||
|
|
||||||
|
# PyCharm
|
||||||
|
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||||
|
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||||
|
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||||
|
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||||
|
#.idea/
|
||||||
|
|
||||||
|
### Python Patch ###
|
||||||
|
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
|
||||||
|
poetry.toml
|
||||||
|
|
||||||
|
# ruff
|
||||||
|
.ruff_cache/
|
||||||
|
|
||||||
|
# LSP config files
|
||||||
|
pyrightconfig.json
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/python,dotenv
|
12
DummyModule.py
Normal file
12
DummyModule.py
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
from module_interface import ModuleInterface
|
||||||
|
class MyModule(ModuleInterface):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.name = "DummyModule1"
|
||||||
|
self.regex_pattern = None #r"my_pattern"
|
||||||
|
|
||||||
|
#print("[Dummy1] DummyModule1 loaded.")
|
||||||
|
|
||||||
|
def execute_module(self, ctx):
|
||||||
|
#print(f"[Dummy1] {self.name} 실행: {ctx}")
|
||||||
|
pass
|
2
example.env
Normal file
2
example.env
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
BOT_INSTANCE=(Your Misskey Instance)
|
||||||
|
BOT_KEY=(Your Misskey api key)
|
90
minya.py
Normal file
90
minya.py
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
from pyfiglet import Figlet
|
||||||
|
f = Figlet(font='small')
|
||||||
|
|
||||||
|
import os
|
||||||
|
import importlib.util
|
||||||
|
import re
|
||||||
|
import inspect
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
from module_interface import ModuleInterface, ModuleManager
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
from aiohttp import ClientWebSocketResponse
|
||||||
|
from mipac.models.notification import NotificationNote
|
||||||
|
from mipa.ext.commands.bot import Bot
|
||||||
|
|
||||||
|
def load_modules():
|
||||||
|
module_dir = "modules"
|
||||||
|
modules = []
|
||||||
|
for filename in os.listdir(module_dir):
|
||||||
|
if filename.endswith(".py"):
|
||||||
|
module_name = os.path.splitext(filename)[0]
|
||||||
|
module_path = os.path.join(module_dir, filename)
|
||||||
|
|
||||||
|
spec = importlib.util.spec_from_file_location(module_name, module_path)
|
||||||
|
module = importlib.util.module_from_spec(spec)
|
||||||
|
spec.loader.exec_module(module)
|
||||||
|
|
||||||
|
for attribute_name in dir(module):
|
||||||
|
attribute = getattr(module, attribute_name)
|
||||||
|
if inspect.isclass(attribute) and issubclass(attribute, ModuleInterface) and attribute != ModuleInterface:
|
||||||
|
modules.append(attribute())
|
||||||
|
return modules
|
||||||
|
|
||||||
|
class MiNya(Bot):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.__modules = []
|
||||||
|
self.__manager = ModuleManager(self)
|
||||||
|
|
||||||
|
async def _connect_channel(self):
|
||||||
|
await self.router.connect_channel(['main'])
|
||||||
|
async def on_reconnect(self, ws: ClientWebSocketResponse):
|
||||||
|
await self._connect_channel()
|
||||||
|
|
||||||
|
async def on_ready(self, ws: ClientWebSocketResponse):
|
||||||
|
await self._connect_channel()
|
||||||
|
print("[Main] Bot System Ready.")
|
||||||
|
print("")
|
||||||
|
print("[Main] Loading Modules...")
|
||||||
|
print("")
|
||||||
|
self.__modules = load_modules()
|
||||||
|
print("")
|
||||||
|
print(f"[Main] Loaded Modules : {len(self.__modules)}")
|
||||||
|
print("")
|
||||||
|
|
||||||
|
print("[Main] Registering Modules...")
|
||||||
|
|
||||||
|
for module in self.__modules:
|
||||||
|
self.__manager.register_module(module)
|
||||||
|
print("")
|
||||||
|
|
||||||
|
async def on_mention(self, notice: NotificationNote):
|
||||||
|
print("[Main] Got Mentioned!")
|
||||||
|
for _, module in self.__manager.modules.items():
|
||||||
|
if module.regex_pattern and re.match(module.regex_pattern, notice.note.content):
|
||||||
|
print("[Main] Regex Matching Module found : ", module.name)
|
||||||
|
if await module.execute_module(notice.note):
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print(f.renderText('MiNya V1'))
|
||||||
|
print('"MIsskey Networked Yet Ambitious"')
|
||||||
|
print('')
|
||||||
|
print("[Main] Minya V1 Bootstap...")
|
||||||
|
print("[Main] Loading settings...")
|
||||||
|
load_dotenv()
|
||||||
|
instance = os.environ.get('BOT_INSTANCE')
|
||||||
|
key = os.environ.get('BOT_KEY')
|
||||||
|
|
||||||
|
if not (instance and key):
|
||||||
|
print("[MAIN] ERR! please check .env or os environment!")
|
||||||
|
return
|
||||||
|
bot = MiNya()
|
||||||
|
asyncio.run(bot.start(f'wss://{instance}/streaming', key))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
38
module_interface.py
Normal file
38
module_interface.py
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
from mipa.ext.commands.bot import Bot
|
||||||
|
|
||||||
|
class ModuleInterface:
|
||||||
|
def __init__(self):
|
||||||
|
self.name = None
|
||||||
|
self.regex_pattern = None
|
||||||
|
self.funcs = {}
|
||||||
|
self.manager: (ModuleManager | None) = None
|
||||||
|
|
||||||
|
def set_manager(self, manager):
|
||||||
|
self.manager = manager
|
||||||
|
self.module_ready()
|
||||||
|
|
||||||
|
def get_execute_pattern(self, regex_pattern):
|
||||||
|
return self.__regex_pattern
|
||||||
|
|
||||||
|
def module_ready(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def execute_module(self, ctx):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_func(self, name):
|
||||||
|
return self.funcs[name]
|
||||||
|
|
||||||
|
|
||||||
|
class ModuleManager:
|
||||||
|
def __init__(self, main_bot = None):
|
||||||
|
self.modules = {}
|
||||||
|
self.bot: (Bot | None) = main_bot
|
||||||
|
|
||||||
|
def require(self, name):
|
||||||
|
return self.modules[name]
|
||||||
|
|
||||||
|
def register_module(self, module):
|
||||||
|
if module.name not in self.modules:
|
||||||
|
self.modules[module.name] = module
|
||||||
|
module.set_manager(self)
|
247
modules/Ai_tem.py
Normal file
247
modules/Ai_tem.py
Normal file
|
@ -0,0 +1,247 @@
|
||||||
|
from module_interface import ModuleInterface
|
||||||
|
import random
|
||||||
|
|
||||||
|
itemPrefixes = [
|
||||||
|
'플라티나로 만든',
|
||||||
|
'신선한',
|
||||||
|
'최신의',
|
||||||
|
'고대의',
|
||||||
|
'수제',
|
||||||
|
'시계장치의',
|
||||||
|
'전설의',
|
||||||
|
'구이',
|
||||||
|
'날것의',
|
||||||
|
'미냐가 만든',
|
||||||
|
'포켓 사이즈',
|
||||||
|
'사흘 전의',
|
||||||
|
'그 근처의',
|
||||||
|
'짭',
|
||||||
|
'사용된',
|
||||||
|
'고장난',
|
||||||
|
'시판되는',
|
||||||
|
'주문제작된',
|
||||||
|
'업무용의',
|
||||||
|
'Microsoft제',
|
||||||
|
'Apple제',
|
||||||
|
'인류 기술의 결정체인',
|
||||||
|
'2021년산',
|
||||||
|
'500kg정도의',
|
||||||
|
'고오급',
|
||||||
|
'썩은',
|
||||||
|
'인공지능 탑재',
|
||||||
|
'블록체인 탑재',
|
||||||
|
'반중력',
|
||||||
|
'접이식',
|
||||||
|
'휴대용',
|
||||||
|
'유전자 재조합',
|
||||||
|
'돌연변이로 비행 능력이 있는',
|
||||||
|
'순금으로 만든',
|
||||||
|
'투명한',
|
||||||
|
'빛나는',
|
||||||
|
'하트 모양의',
|
||||||
|
'움직이는',
|
||||||
|
'반으로 잘린',
|
||||||
|
'USB 커넥터가 달린',
|
||||||
|
'지난 날의',
|
||||||
|
'저주받은',
|
||||||
|
'인챈트된',
|
||||||
|
'하루치의 비타민이 들어간',
|
||||||
|
'손을 댄',
|
||||||
|
'환상의',
|
||||||
|
'가상의',
|
||||||
|
'원자력',
|
||||||
|
'고도로 훈련받은',
|
||||||
|
'유전자 조작이 아닌',
|
||||||
|
'런던 중심부에서 발견된',
|
||||||
|
'이세계의',
|
||||||
|
'다른 별의',
|
||||||
|
'수수께끼의',
|
||||||
|
'시공을 일그러뜨리는',
|
||||||
|
'이상한 소리가 나는',
|
||||||
|
'무산된',
|
||||||
|
'플라즈마화된',
|
||||||
|
'충격을 주면 낮은 확률로 폭발하는',
|
||||||
|
'주키니로 변신한',
|
||||||
|
'가설의',
|
||||||
|
'독이 있는',
|
||||||
|
'진짜',
|
||||||
|
'궁극의',
|
||||||
|
'초코가 들어간',
|
||||||
|
'악취가 나는',
|
||||||
|
'4차원',
|
||||||
|
'박동하는',
|
||||||
|
'정체를 알 수 없는',
|
||||||
|
'네모난',
|
||||||
|
'날뛰는',
|
||||||
|
'꿈의',
|
||||||
|
'어둠의',
|
||||||
|
'암흑의',
|
||||||
|
'봉인된',
|
||||||
|
'죽음의',
|
||||||
|
'얼어버린',
|
||||||
|
'마의',
|
||||||
|
'금단의',
|
||||||
|
'홀로그래픽',
|
||||||
|
'유압식',
|
||||||
|
]
|
||||||
|
|
||||||
|
items = [
|
||||||
|
'가지',
|
||||||
|
'토마토',
|
||||||
|
'오이',
|
||||||
|
'감자',
|
||||||
|
'볶음국수',
|
||||||
|
'허리',
|
||||||
|
'초밥',
|
||||||
|
'호박',
|
||||||
|
'유키치',
|
||||||
|
'금괴',
|
||||||
|
'알루미늄',
|
||||||
|
'나트륨',
|
||||||
|
'마그네슘',
|
||||||
|
'플루토늄',
|
||||||
|
'작은 금속',
|
||||||
|
'우유팩',
|
||||||
|
'페트병',
|
||||||
|
'쿠키',
|
||||||
|
'초콜릿',
|
||||||
|
'메이드복',
|
||||||
|
'오렌지',
|
||||||
|
'니삭스',
|
||||||
|
'반물질 콘덴서',
|
||||||
|
'입자가속기',
|
||||||
|
'마이크로프로세서 (8코어 16스레드)',
|
||||||
|
'원자력 발전소',
|
||||||
|
'L4 스위치',
|
||||||
|
'완충 체인',
|
||||||
|
'양전자 두뇌',
|
||||||
|
'행성',
|
||||||
|
'테르민',
|
||||||
|
'충치차',
|
||||||
|
'마운터',
|
||||||
|
'버킷 휠 익스커베이터',
|
||||||
|
'데몬 코어',
|
||||||
|
'게임보이 어드밴스',
|
||||||
|
'양자컴퓨터',
|
||||||
|
'아나몰픽 렌즈',
|
||||||
|
'벽장에서 나온 수수께끼의 생물',
|
||||||
|
'스마트폰',
|
||||||
|
'시계',
|
||||||
|
'푸딩',
|
||||||
|
'가브리엘의 나팔',
|
||||||
|
'맹거의 스펀지',
|
||||||
|
'피젯 스피너',
|
||||||
|
'초입방체',
|
||||||
|
'건축물',
|
||||||
|
'에너지 드링크',
|
||||||
|
'마우스 커서',
|
||||||
|
'안경',
|
||||||
|
'참치',
|
||||||
|
'쓰레기통',
|
||||||
|
'이쑤시개',
|
||||||
|
'도시락에 들어가는 초록색 칸막이같은 녀석',
|
||||||
|
'나무젓가락',
|
||||||
|
'환기구',
|
||||||
|
'페트병의 뚜껑',
|
||||||
|
'소파 블럭',
|
||||||
|
'피자',
|
||||||
|
'치약',
|
||||||
|
'깡통',
|
||||||
|
'열쇠고리',
|
||||||
|
'금발 벽안의 미소녀',
|
||||||
|
'SD카드',
|
||||||
|
'립 크림',
|
||||||
|
'초코 없는 초코소라빵',
|
||||||
|
'조류독감',
|
||||||
|
'자판기',
|
||||||
|
'무거운 것',
|
||||||
|
'노트북',
|
||||||
|
'육포',
|
||||||
|
'연어 치즈',
|
||||||
|
'다이아몬드',
|
||||||
|
'물체',
|
||||||
|
'월석',
|
||||||
|
'특이점',
|
||||||
|
'중성자별',
|
||||||
|
'액체',
|
||||||
|
'위성',
|
||||||
|
'주키니',
|
||||||
|
'검은 것',
|
||||||
|
'흰 것',
|
||||||
|
'빨간 것',
|
||||||
|
'동그란 것',
|
||||||
|
'네모난 것',
|
||||||
|
'카드 모양의 것',
|
||||||
|
'기체',
|
||||||
|
'연필',
|
||||||
|
'지우개',
|
||||||
|
'양날검',
|
||||||
|
'막대 모양의 것',
|
||||||
|
'농산물',
|
||||||
|
'메탈 슬라임',
|
||||||
|
'문어발',
|
||||||
|
'버섯',
|
||||||
|
'나메코',
|
||||||
|
'호로요이',
|
||||||
|
'손톱깎기',
|
||||||
|
'귓속말',
|
||||||
|
'인형',
|
||||||
|
'티라노사우르스',
|
||||||
|
'요로결석',
|
||||||
|
'엔터 키',
|
||||||
|
'항아리',
|
||||||
|
'수은',
|
||||||
|
'DHMO',
|
||||||
|
'물',
|
||||||
|
'토지',
|
||||||
|
'대륙',
|
||||||
|
'주사위',
|
||||||
|
'실외기',
|
||||||
|
'유압잭',
|
||||||
|
'타피오카',
|
||||||
|
'PSP',
|
||||||
|
'화장지 심지',
|
||||||
|
'골판지 상자',
|
||||||
|
'하니와',
|
||||||
|
'볼펜',
|
||||||
|
'샤펜',
|
||||||
|
'원자',
|
||||||
|
'우주',
|
||||||
|
'소립자',
|
||||||
|
'참기름',
|
||||||
|
'undefined',
|
||||||
|
'None',
|
||||||
|
'NAN',
|
||||||
|
'[object Object]'
|
||||||
|
]
|
||||||
|
|
||||||
|
ands = [
|
||||||
|
'에 빙의한',
|
||||||
|
'에 들어가는',
|
||||||
|
'에 묻힌',
|
||||||
|
'을 연상시키는',
|
||||||
|
' 같은',
|
||||||
|
'로 가장한',
|
||||||
|
'에 올려진',
|
||||||
|
' 옆에 있는',
|
||||||
|
];
|
||||||
|
|
||||||
|
from mipac.models import Note
|
||||||
|
class AiTem(ModuleInterface):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.name = "Ai-tem"
|
||||||
|
self.regex_pattern = ".*Test_AI-tem"
|
||||||
|
|
||||||
|
print("[Ai-tem] Ai-like item generator, Ai-tem V1 loaded.")
|
||||||
|
|
||||||
|
async def execute_module(self, ctx: Note):
|
||||||
|
print("[Ai-tem] test Generate Note")
|
||||||
|
await ctx.api.action.reply(str(self._generate()), visibility="home")
|
||||||
|
|
||||||
|
def _generate(self):
|
||||||
|
return random.choice(itemPrefixes) + ' ' + random.choice(items) + ((random.choice(ands) + ' ' + random.choice(itemPrefixes) + ' ' + random.choice(items)) if random.choice([True, False]) else "")
|
||||||
|
|
||||||
|
def module_ready(self):
|
||||||
|
self.funcs["generate"] = self._generate
|
||||||
|
print("[Ai-tem] Module Ready.")
|
53
modules/Amumal.py
Normal file
53
modules/Amumal.py
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
from module_interface import ModuleInterface
|
||||||
|
from mipa.ext import tasks
|
||||||
|
import random
|
||||||
|
|
||||||
|
Amumals = {
|
||||||
|
"notes": [
|
||||||
|
"아무말 모듈 테스트 중이에요!",
|
||||||
|
"별거 아닌 일에는 '어?' 금지에요!",
|
||||||
|
"미레라도의 아이돌, 미냐에요!",
|
||||||
|
"빙구르르...",
|
||||||
|
"잠이여 물러가세요!",
|
||||||
|
"좋아... 이 버튼을 누르면..! 어라..?",
|
||||||
|
"겍...",
|
||||||
|
"리아님이 안놀아줘요...",
|
||||||
|
"미레라도? 미래라도? 헷갈려요!",
|
||||||
|
"배가 고파서 저기 메모리에 굴러다니던 푸딩을 먹었어요!",
|
||||||
|
"어라라, 분명 뭔가 하려고 했었는데..??",
|
||||||
|
#"가끔씩은 이웃집에도 놀러가보고 싶어요♪",
|
||||||
|
"피곤하신가요? 오늘도 수고하셨어요!",
|
||||||
|
"이불 밖은 던전이에요!",
|
||||||
|
"미냐 안자요",
|
||||||
|
"옆집에는 좋은 이름을 가진 친구가 있는 것 같아요!",
|
||||||
|
"아이와 친구가 되고 싶어요... 일본어는 못하지만요...",
|
||||||
|
"코...",
|
||||||
|
"리아님 놀아주세요!",
|
||||||
|
"저는 심연은 아니지만 여러분을 들여다 볼 수 있어요.",
|
||||||
|
"꾸벅...",
|
||||||
|
"레라님 일하세요!",
|
||||||
|
"집에 가고싶나요? 저도 가고싶어요!"
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Amumal(ModuleInterface):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.name = "Amumal"
|
||||||
|
self.regex_pattern = r"//"
|
||||||
|
|
||||||
|
print("[Amumal] Random message module, Amumal V1 loaded.")
|
||||||
|
|
||||||
|
def module_ready(self):
|
||||||
|
print("[Amumal] Module Ready.")
|
||||||
|
self.amumal_task.start()
|
||||||
|
|
||||||
|
@tasks.loop(seconds=600.0)
|
||||||
|
async def amumal_task(self):
|
||||||
|
aitem = str(self.manager.require("Ai-tem").get_func("generate")())
|
||||||
|
if random.choice([True, False]):
|
||||||
|
await self.manager.bot.client.note.action.send(random.choice(Amumals["notes"] + [aitem + "이 가지고 싶어요...", "오늘 산책 중에 " + aitem + "을 봤어요!"]), visibility="home")
|
||||||
|
print("[Amumal] Sent Amumal!")
|
||||||
|
|
20
modules/Birthday.py
Normal file
20
modules/Birthday.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
from module_interface import ModuleInterface
|
||||||
|
from mipa.ext import tasks
|
||||||
|
import random
|
||||||
|
|
||||||
|
class Birthday(ModuleInterface):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.name = "Birthday"
|
||||||
|
self.regex_pattern = r"//"
|
||||||
|
|
||||||
|
print("[Birthday] Happy birthday message module, Birthday V1 loaded.")
|
||||||
|
|
||||||
|
def module_ready(self):
|
||||||
|
print("[Birthday] Module Ready.")
|
||||||
|
self.birthday_task.start()
|
||||||
|
|
||||||
|
@tasks.loop(seconds=600.0)
|
||||||
|
async def birthday_task(self):
|
||||||
|
#awa
|
||||||
|
pass
|
20
modules/Follow.py
Normal file
20
modules/Follow.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
from module_interface import ModuleInterface
|
||||||
|
from mipac.models import Note
|
||||||
|
|
||||||
|
class Follow(ModuleInterface):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.name = "Follow"
|
||||||
|
self.regex_pattern = r".*팔로우\s*(부탁\s*해|해?\s*(주(\s*십\s*시\s*오|세요)|줘))"
|
||||||
|
|
||||||
|
print("[Follow] Auto follow module, Follow V1 loaded.")
|
||||||
|
|
||||||
|
async def execute_module(self, ctx: Note):
|
||||||
|
print(f"[Follow] Got Follow Related Message : {ctx.content}")
|
||||||
|
|
||||||
|
usr = await self.manager.bot.user.api.action.get(ctx.author.id)
|
||||||
|
if usr.is_following:
|
||||||
|
await ctx.api.action.reply("이미 팔로우 되어있어요..! 저를 잊으셨나요..?")
|
||||||
|
else:
|
||||||
|
await usr.api.follow.action.add()
|
||||||
|
await ctx.api.action.reply("잘 부탁드려요!")
|
31
modules/Timer.py
Normal file
31
modules/Timer.py
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import re
|
||||||
|
import asyncio
|
||||||
|
from module_interface import ModuleInterface
|
||||||
|
class Timer(ModuleInterface):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.name = "Timer"
|
||||||
|
self.regex_pattern = r"((.|\n)*)(타이머\s.*(맞춰줘|설정해줘))|.*(뒤에\s*알려줘)"
|
||||||
|
|
||||||
|
print("[Timer] Settable timer module, Timer V1 loaded.")
|
||||||
|
|
||||||
|
async def execute_module(self, ctx):
|
||||||
|
print(f"[Timer] Got Timer Related Message : {ctx.content}")
|
||||||
|
|
||||||
|
text = ctx.content
|
||||||
|
seconds_query = re.search(r'([0-9]+)초', text)
|
||||||
|
minutes_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
|
||||||
|
minutes = int(minutes_query.group(1)) if minutes_query else 0
|
||||||
|
hours = int(hours_query.group(1)) if hours_query else 0
|
||||||
|
|
||||||
|
if ((seconds + minutes + hours) == 0):
|
||||||
|
await ctx.api.action.reply("올바른 값이 아니에요...")
|
||||||
|
|
||||||
|
time = (seconds) + (60 * minutes) + (60 * 60 * hours)
|
||||||
|
|
||||||
|
await ctx.api.action.reply("타이머를 설정할게요!")
|
||||||
|
await asyncio.sleep(int(time))
|
||||||
|
await ctx.api.action.reply("시간이 다 되었어요!")
|
Loading…
Reference in a new issue