Skip to content

Commit 5b06428

Browse files
authored
Merge pull request #860 from dev-hato/fono/add-omikuji
おみくじライブラリを書いた
2 parents 8d8ae41 + 2e95cce commit 5b06428

5 files changed

Lines changed: 163 additions & 1 deletion

File tree

library/omikuji.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# coding: utf-8
2+
3+
"""
4+
おみくじを返す
5+
"""
6+
7+
from typing import Tuple, TypeVar
8+
from dataclasses import dataclass
9+
from random import choices
10+
11+
12+
@dataclass
13+
class OmikujiResult():
14+
"""
15+
おみくじの引いた結果を示すデータクラス
16+
出やすさの調整もここで行う
17+
"""
18+
appearance: int
19+
message: str
20+
21+
def __post_init__(self):
22+
"""
23+
初期化後のアサーション
24+
"""
25+
assert self.appearance > 0
26+
assert self.message != ''
27+
28+
29+
TOmikujiEnum = TypeVar('TOmikujiEnum')
30+
OmikujiResults = dict[TOmikujiEnum, OmikujiResult]
31+
32+
33+
def draw(entries: OmikujiResults) -> Tuple[TOmikujiEnum, OmikujiResult]:
34+
"""
35+
おみくじを引く
36+
"""
37+
38+
return choices(
39+
population=list(entries.items()),
40+
weights=list(
41+
map(lambda entry: entry.appearance, entries.values())),
42+
k=1
43+
)[0]

plugins/analyze.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ def analyze_message(message: str) -> Callable[[BaseClient], None]:
2424
'標高': lambda m: hato.altitude((m[len('標高'):]).strip()),
2525
'version': lambda m: hato.version,
2626
'にゃーん': lambda m: hato.yoshiyoshi,
27+
'おみくじ': lambda m: hato.omikuji,
2728
}
2829

2930
for key, method in conditions.items():

plugins/hato.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import json
77
import os
88
import re
9+
from enum import Enum, auto
910
from logging import getLogger
1011
from tempfile import NamedTemporaryFile
1112
from typing import List
@@ -22,6 +23,7 @@
2223
from library.hatokaraage import hato_ha_karaage
2324
from library.clientclass import BaseClient
2425
from library.jma_amesh import jma_amesh
26+
from library.omikuji import OmikujiResult, OmikujiResults, draw as omikuji_draw
2527
logger = getLogger(__name__)
2628

2729

@@ -54,6 +56,7 @@ def help_message(client: BaseClient):
5456
'text delete [int] ... 指定した番号[int]のパワーワードを削除する。 ',
5557
'>< [text] ... 文字列[text]を吹き出しで表示する。',
5658
'にゃーん ... 「よしよし」と返す。',
59+
'おみくじ ... おみくじを引いて返す。',
5760
'version ... バージョン情報を表示する。',
5861
'',
5962
'詳細はドキュメント(https://github.com/dev-hato/hato-bot/wiki)も見てくれっぽ!',
@@ -273,3 +276,65 @@ def yoshiyoshi(client: BaseClient):
273276
logger.debug("%s called 'hato yoshiyoshi'", client.get_send_user())
274277
logger.debug("%s app called 'hato yoshiyoshi'", client.get_type())
275278
client.post('よしよし')
279+
280+
281+
# 以下おみくじの設定
282+
# Refer: dev-hato/hato-bot#876
283+
class OmikujiEnum(Enum):
284+
"""
285+
おみくじの結果一覧
286+
"""
287+
DAI_KICHI = auto()
288+
CHU_KICHI = auto()
289+
SHO_KICHI = auto()
290+
KICHI = auto()
291+
SUE_KICHI = auto()
292+
AGE_KICHI = auto()
293+
KYO = auto()
294+
DAI_KYO = auto()
295+
296+
297+
omikuji_results = OmikujiResults({
298+
OmikujiEnum.DAI_KICHI: OmikujiResult(
299+
12,
300+
":tada: 大吉 何でもうまくいく!!気がする!!"
301+
),
302+
OmikujiEnum.KICHI: OmikujiResult(
303+
100,
304+
":smirk: 吉 まあうまくいくかも!?"
305+
),
306+
OmikujiEnum.CHU_KICHI: OmikujiResult(
307+
100,
308+
":smile: 中吉 そこそこうまくいくかも!?"
309+
),
310+
OmikujiEnum.SHO_KICHI: OmikujiResult(
311+
100,
312+
":smily: 小吉 なんとなくうまくいくかも!?"
313+
),
314+
OmikujiEnum.SUE_KICHI: OmikujiResult(
315+
37,
316+
":expressionless: 末吉 まあ多分うまくいくかもね……!?"
317+
),
318+
OmikujiEnum.AGE_KICHI: OmikujiResult(
319+
2,
320+
":poultry_leg: 揚げ吉 鳩を揚げると良いことあるよ!!"
321+
),
322+
OmikujiEnum.KYO: OmikujiResult(
323+
12,
324+
":cry: 凶 ちょっと慎重にいったほうがいいかも……"
325+
),
326+
OmikujiEnum.DAI_KYO: OmikujiResult(
327+
2,
328+
":crying_cat_face: 大凶 そういう時もあります……猫になって耐えましょう"
329+
),
330+
})
331+
332+
333+
def omikuji(client: BaseClient):
334+
"""
335+
おみくじ結果を返す
336+
"""
337+
338+
logger.debug("%s called 'hato yoshiyoshi'", client.get_send_user())
339+
logger.debug("%s app called 'hato yoshiyoshi'", client.get_type())
340+
client.post(omikuji_draw(omikuji_results)[1].message)

tests/library/test_omikuji.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""
2+
omikujiライブラリのテスト
3+
"""
4+
5+
import unittest
6+
7+
from enum import Enum, auto
8+
from library.omikuji import OmikujiResult, OmikujiResults, draw
9+
10+
11+
class TestOmikuji(unittest.TestCase):
12+
"""
13+
おみくじのテスト
14+
"""
15+
16+
def test_omikuji_minimum(self):
17+
"""
18+
おみくじの実装が正常か
19+
"""
20+
class DummyOmikujiEnum(Enum):
21+
"""
22+
おみくじ設定(ダミー)
23+
"""
24+
KICHI = auto()
25+
SUE_KICHI = auto()
26+
27+
dummy_omikuji_results = OmikujiResults({
28+
DummyOmikujiEnum.KICHI: OmikujiResult(1, "吉"),
29+
DummyOmikujiEnum.SUE_KICHI: OmikujiResult(1, "末吉"),
30+
})
31+
32+
self.assertIn(
33+
draw(dummy_omikuji_results)[0],
34+
dummy_omikuji_results.keys()
35+
)

tests/plugins/test_hato.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import requests_mock
1111

1212
import slackbot_settings as conf
13-
from plugins.hato import split_command, amesh, altitude, yoshiyoshi
13+
from plugins.hato import split_command, amesh, altitude, yoshiyoshi, omikuji, omikuji_results
1414
from tests.library.test_geo import set_mock
1515
from tests.plugins import TestClient
1616

@@ -232,5 +232,23 @@ def test_yoshiyoshi(self):
232232
self.assertEqual(client1.get_post_message(), 'よしよし')
233233

234234

235+
class TestOmikuji(unittest.TestCase):
236+
"""
237+
omikujiのテスト
238+
"""
239+
240+
def test_omikuji(self):
241+
"""
242+
設定したおみくじ結果のうち1つが返ってくる
243+
"""
244+
245+
client1 = TestClient()
246+
omikuji(client1)
247+
self.assertIn(
248+
client1.get_post_message(),
249+
map(lambda e: e.message, omikuji_results.values())
250+
)
251+
252+
235253
if __name__ == '__main__':
236254
unittest.main()

0 commit comments

Comments
 (0)