Skip to content

Instantly share code, notes, and snippets.

@sizumita
Created December 19, 2021 14:51
Show Gist options
  • Save sizumita/45b875262484081d9c6ec39cea4dd180 to your computer and use it in GitHub Desktop.
Save sizumita/45b875262484081d9c6ec39cea4dd180 to your computer and use it in GitHub Desktop.
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"])
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