
作りたいもの
Discord Botにあるモーダルウィンドウを活用してフォーム的な物を作成する。
Discord Botに実装した他の機能と合わせて使用できる、記録フォーム的なツールとして活用したい。
GASの記述
スプレッドシートを作成し、「拡張機能」から「Apps Script」をクリックしてエディタを開き、以下を記述する。
GAS
function doGet(e) {
//データ
var dt = e.parameter.dt;
var mail = e.parameter.mail;
var name = e.parameter.name;
var subject = e.parameter.subject;
var contents = e.parameter.contents;
//Activeになっているsheetを取得
var sheet = SpreadsheetApp.getActiveSheet();
//書き込み
sheet.appendRow([dt, mail, name, subject, contents]);
}
「デプロイ」から「新しいデプロイ」→「ウェブアプリ」→アクセスできるユーザーを全員に設定する。
これにより、URLを知っている全員がアクセス可能な状態になるため、URLの管理には注意する。
作成したウェブアプリのURLをメモする。
Botのプログラム
bot.py
#!/usr/bin/python3
import discord
from discord.ext import commands
import datetime
import requests
import datetime
url = 'ウェブアプリURL'
#スプレッドシートに記録するためのリクエスト用URLを作成
def mkUrl(url, dt, mail, name, subject, contents):
newUrl = url + '?'
newUrl += 'dt=' + str(dt) + '&'
newUrl += 'mail=' + str(mail) + '&'
newUrl += 'name=' + str(name) + '&'
newUrl += 'subject=' + str(subject) + '&'
newUrl += 'contents=' + str(contents) + '&'
return newUrl
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(
command_prefix=commands.when_mentioned_or("!"), debug_guilds=[サーバーID], intents=intents
)
client = discord.Client()
channel = チャンネルID
@bot.event
async def on_ready():
print('[INFO] <' + str(datetime.datetime.now().replace(microsecond=0)) + '> Bot is active')
class MyModal(discord.ui.Modal):
def __init__(self, *args, **kwargs) -> None:
#setting mnodal
super().__init__(
discord.ui.InputText(
label="Mail",
placeholder="◯◯◯◯@◯◯◯◯◯◯",
style=discord.InputTextStyle.short,
required = True, #必須項目
),
discord.ui.InputText(
label="Name",
placeholder="Python×Raspi",
style=discord.InputTextStyle.short,
required = True,
),
discord.ui.InputText(
label="Subject",
placeholder="〇〇の件について",
style=discord.InputTextStyle.short,
required = True,
),
discord.ui.InputText(
label="Contents",
placeholder="あsdfghjkl;:」",
style=discord.InputTextStyle.long, #複数行
required = True,
),
*args,
**kwargs,
)
async def callback(self, interaction: discord.Interaction):
#Response
embed = discord.Embed(
title="Request",
fields=[
discord.EmbedField(
name="> Mail", value=self.children[0].value, inline=False
),
discord.EmbedField(
name="> Name", value=self.children[1].value, inline=False
),
discord.EmbedField(
name="> Subject", value=self.children[2].value, inline=False
),
discord.EmbedField(
name="> Contents", value=self.children[3].value, inline=False
),
],
color=discord.Color.from_rgb(153,170,181)
)
await interaction.response.defer()
#ここからモーダルの処理
dt = str(datetime.datetime.now().replace(microsecond=0))
mail=self.children[0].value
name=self.children[1].value
subject=self.children[2].value
contents=self.children[3].value
#スプレッドシートに送信
upUrl = mkUrl(url, dt, mail, name, subject, contents)
requests.get(upUrl)
await interaction.followup.send(embeds=[embed])
@bot.slash_command(name="modal")
async def modal_slash(ctx: discord.ApplicationContext):
"""Modal Window"""
modal = MyModal(title="Modal Form")
await ctx.send_modal(modal)
bot.run("TOKEN")
実行結果



0 件のコメント:
コメントを投稿