Created
December 19, 2021 14:51
-
-
Save sizumita/45b875262484081d9c6ec39cea4dd180 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import discord | |
from discord.ext.ui import ViewTracker, MessageProvider | |
from view import LookThatWayView | |
client = discord.Client(intents=discord.Intents.all()) | |
@client.event | |
async def on_ready(): | |
print("ready") | |
@client.event | |
async def on_message(message: discord.Message): | |
if message.author.bot: | |
return | |
if not message.content.startswith("!lookthatway"): | |
return | |
view = LookThatWayView(client, message.author, message.mentions[0]) | |
await ViewTracker(view, 300).track(MessageProvider(message.channel)) | |
client.run(os.environ["DISCORD_BOT_TOKEN"]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import asyncio | |
from enum import Enum, auto | |
from typing import Optional | |
import discord | |
from discord.ext.ui import View, Message, Button, ObservableObject, utils, published | |
class State(Enum): | |
Janken = auto() | |
JankenDraw = auto() | |
LookThatWay = auto() | |
LookThatWayDraw = auto() | |
End = auto() | |
class Hand(Enum): | |
Lock = 0 | |
Scissors = 1 | |
Paper = 2 | |
class Player(Enum): | |
Left = 1 | |
Right = 2 | |
class Face(Enum): | |
Top = "๐" | |
Down = "๐" | |
Left = "๐" | |
Right = "๐" | |
class LookThatWayViewModel(ObservableObject): | |
state = published("state") | |
def __init__(self, left: discord.Member, right: discord.Member): | |
super().__init__() | |
self.left = left | |
self.right = right | |
self.state: State = State.Janken | |
self.left_hand: Optional[Hand] = None | |
self.right_hand: Optional[Hand] = None | |
self.left_face: Optional[Face] = None | |
self.right_face: Optional[Face] = None | |
self.janken_winner: Optional[Player] = None | |
def get_janken_winner(self): | |
if self.janken_winner == Player.Left: | |
return self.left | |
return self.right | |
def calculate_janken_winner(self): | |
ret = (self.left_hand.value - self.right_hand.value + 3) % 3 | |
if ret == 2: | |
# left win | |
self.janken_winner = Player.Left | |
self.state = State.LookThatWay | |
elif ret == 1: | |
self.janken_winner = Player.Right | |
self.state = State.LookThatWay | |
else: | |
self.janken_winner = None | |
self.state = State.JankenDraw | |
self.left_hand = None | |
self.right_hand = None | |
def clear(self): | |
self.left_hand = None | |
self.right_hand = None | |
self.left_face = None | |
self.right_face = None | |
self.janken_winner = None | |
self.state = State.Janken | |
async def calculate_winner(self): | |
if self.left_face == self.right_face: | |
self.state = State.End | |
return | |
self.state = State.LookThatWayDraw | |
await asyncio.sleep(3) | |
self.clear() | |
self.state = State.Janken | |
async def set_hand(self, interaction: discord.Interaction, hand: Hand): | |
if interaction.user.id == self.left.id: | |
self.left_hand = hand | |
elif interaction.user.id == self.right.id: | |
self.right_hand = hand | |
else: | |
return | |
await interaction.response.send_message( | |
f"้ธๆใใพใใ", | |
ephemeral=True | |
) | |
if self.left_hand is not None and self.right_hand is not None: | |
self.calculate_janken_winner() | |
async def set_face(self, interaction: discord.Interaction, face: Face): | |
if interaction.user.id == self.left.id: | |
self.left_face = face | |
elif interaction.user.id == self.right.id: | |
self.right_face = face | |
else: | |
return | |
await interaction.response.send_message( | |
f"{face.value}ใ้ธๆใใพใใ", | |
ephemeral=True | |
) | |
if self.left_face is not None and self.right_face is not None: | |
await self.calculate_winner() | |
class LookThatWayView(View): | |
def __init__(self, client: discord.Client, left: discord.Member, right: discord.Member): | |
self.view_model = LookThatWayViewModel(left, right) | |
super().__init__(client.loop) | |
async def body(self) -> Message: | |
if self.view_model.state == State.Janken: | |
return Message() \ | |
.embed(discord.Embed( | |
title="ใใฃใกๅใใฆใใค๏ผ", | |
description=f"{self.view_model.left.mention}ใจ{self.view_model.right.mention}ใใใฃใกๅใใฆใใคใงๅ่ฒ ๏ผ\nใใใใใใใใฆใใ ใใ๏ผ" | |
))\ | |
.items([ | |
Button("ใฐใผ") | |
.emoji("โ").on_click(utils.async_interaction_partial(self.view_model.set_hand, Hand.Lock)), | |
Button("ใใงใญ") | |
.emoji("โ๏ธ").on_click(utils.async_interaction_partial(self.view_model.set_hand, Hand.Scissors)), | |
Button("ใใผ") | |
.emoji("โ").on_click(utils.async_interaction_partial(self.view_model.set_hand, Hand.Paper)), | |
]) | |
elif self.view_model.state == State.JankenDraw: | |
return Message() \ | |
.embed(discord.Embed( | |
title="ใใฃใกๅใใฆใใค๏ผ", | |
description=f"{self.view_model.left.mention}ใจ{self.view_model.right.mention}ใใใฃใกๅใใฆใใคใงๅ่ฒ ๏ผ\n\nๅผใๅใใ ใฃใใฎใงๅๅบฆใธใฃใณใฑใณใใฆใใ ใใ๏ผ" | |
)) \ | |
.items([ | |
Button("ใฐใผ") | |
.emoji("โ").on_click(utils.async_interaction_partial(self.view_model.set_hand, Hand.Lock)), | |
Button("ใใงใญ") | |
.emoji("โ๏ธ").on_click(utils.async_interaction_partial(self.view_model.set_hand, Hand.Scissors)), | |
Button("ใใผ") | |
.emoji("โ").on_click(utils.async_interaction_partial(self.view_model.set_hand, Hand.Paper)), | |
]) | |
elif self.view_model.state == State.LookThatWay: | |
msg = Message() | |
msg.embed( | |
discord.Embed( | |
title="ใใฃใกๅใใฆใใค๏ผ", | |
description=f"{self.view_model.left.mention}ใๅๅฉ๏ผไธก่ ใจใ้กใฎๅใใ้ธๆใใฆใใ ใใ๏ผ" | |
) | |
) | |
msg.item(Button("ไธ").emoji("๐").on_click(utils.async_interaction_partial(self.view_model.set_face, Face.Top))) | |
msg.item(Button("ไธ").emoji("๐").on_click(utils.async_interaction_partial(self.view_model.set_face, Face.Down))) | |
msg.item(Button("ๅณ").emoji("๐").on_click(utils.async_interaction_partial(self.view_model.set_face, Face.Right))) | |
msg.item(Button("ๅทฆ").emoji("๐").on_click(utils.async_interaction_partial(self.view_model.set_face, Face.Left))) | |
return msg | |
elif self.view_model.state == State.LookThatWayDraw: | |
msg = Message() | |
msg.embed( | |
discord.Embed( | |
title="ใใฃใกๅใใฆใใค๏ผ", | |
description=f"{self.view_model.left.mention}: {self.view_model.left_face.value}\n" | |
f"{self.view_model.right.mention}: {self.view_model.right_face.value}\n" | |
f"ๅ่ ใใใพใใใงใใใฎใงใไธ็งๅพใซๅๅบฆใใใใใใ้ๅงใใใพใใ" | |
) | |
) | |
return msg | |
elif self.view_model.state == State.End: | |
msg = Message() | |
msg.embed( | |
discord.Embed( | |
title="ใใฃใกๅใใฆใใค๏ผ", | |
description=f"{self.view_model.left.mention}: {self.view_model.left_face.value}\n" | |
f"{self.view_model.right.mention}: {self.view_model.right_face.value}\n\n" | |
f"{self.view_model.get_janken_winner().mention}ใฎๅใก๏ผ" | |
) | |
) | |
return msg |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment