作りたいもの
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 件のコメント:
コメントを投稿