diff --git a/dislocker_slash.py b/dislocker_slash.py index 6484861..913b543 100644 --- a/dislocker_slash.py +++ b/dislocker_slash.py @@ -700,6 +700,67 @@ class DL(): except Exception as error: self.log(title=f"[ERROR] デバイス登録用のワンタイムパスワードを発行中にエラーが発生しました。 {str(error.__class__.__name__)}", message=str(error.args), flag=1) return {"result": 1, "about": "error"} + + +class ReasonModal(discord.ui.Modal): + def __init__(self, title: str, pc_number: str, keyboard_number: str, mouse_number: str, timeout=15) -> None: + super().__init__(title=title, timeout=timeout) + self.reason_input_form = discord.ui.TextInput(label="使用目的を入力してください", style=discord.ui.TextInput.short, custom_id=f"register_{pc_number}_{keyboard_number}_{mouse_number}") + self.add_item(self.reason_input_form) + + async def on_submit(self, interaction: discord.Interaction) -> None: + custom_id = interaction.data["components"][0]["components"][0]["custom_id"] + custom_id_split = custom_id.split("_") + pc_number = custom_id_split[1] + keyboard_number = custom_id_split[2] + mouse_number = custom_id_split[3] + + if keyboard_number == "own": + keyboard_number_show = "自前" + else: + keyboard_number_show = keyboard_number + + if mouse_number == "own": + mouse_number_show = "自前" + else: + mouse_number_show = mouse_number + + register = dislocker.register(discord_user_id=interaction.user.id, name=interaction.user.name, display_name=interaction.user.display_name, pc_number=pc_number, keyboard_number=keyboard_number, mouse_number=mouse_number, detail=self.reason_input_form.value) + + if register["about"] == "ok": + await interaction.response.send_message(f":white_check_mark: 使用が開始されました。\n>>> # パスワード | {register["output_dict"]["password"]}\n## PC番号 | {pc_number}\n## キーボード番号 | {keyboard_number_show}\n## マウス番号 | {mouse_number_show}\n## 使用目的 | {self.reason_input_form.value}", ephemeral=True) + await client.get_channel(dislocker.server_config["bot"]["log_channel_id"]).send(f':white_check_mark: {register["output_dict"]["name"]} さんがPC {pc_number} の使用を開始しました。\n>>> ## PC番号 | {pc_number}\n## キーボード番号 | {keyboard_number_show}\n## マウス番号 | {mouse_number_show}\n## 使用目的 | {self.reason_input_form.value}') + dislocker.log(title=f"[INFO] PC番号{pc_number} の使用が開始されました。", message=f"名前 | {register["output_dict"]["name"]}, 使用目的 | {self.reason_input_form.value}", flag=0) + elif register["about"] == "pc_already_in_use_by_you": + pc_usage_history = register["pc_usage_history"] + if pc_usage_history["keyboard_number"] == None: + keyboard_number_show = "未認証" + elif pc_usage_history["keyboard_number"] == 0: + keyboard_number_show = "自前" + else: + keyboard_number_show = str(pc_usage_history["keyboard_number"]) + + if pc_usage_history["mouse_number"] == None: + mouse_number_show = "未認証" + elif pc_usage_history["mouse_number"] == 0: + mouse_number_show = "自前" + else: + mouse_number_show = str(pc_usage_history["mouse_number"]) + + await interaction.response.send_message(f"# :exploding_head: あなたはPCをもう使用されているようです。\n使用状態を解除するには 終了ボタン で使用終了をお知らせください。\n>>> # PC番号 | {pc_usage_history["pc_number"]}\n# キーボード番号 | {keyboard_number_show}\n# マウス番号 | {mouse_number_show}\n# 使用開始時刻 | {pc_usage_history["start_time"]}", ephemeral=True) + #await interaction.response.send_message(f"# :exploding_head: あなたはPCをもう使用されているようです。\n使用状態を解除するには 終了ボタン で使用終了をお知らせください。\n>>> # PC番号 | {pc_usage_history["pc_number"]}\n# キーボード番号 | {keyboard_number_show}\n# マウス番号 | {mouse_number_show}\n# 使用開始時刻 | {pc_usage_history["start_time"]}\n# 使用目的 | {pc_usage_history["use_detail"]}", ephemeral=True) + + elif register["about"] == "pc_already_in_use_by_other": + await interaction.response.send_message(f"# :man_gesturing_no: そのPCは他のメンバーによって使用されています。\n別のPC番号を指定して、再度お試しください。", ephemeral=True) + elif register["about"] == "keyboard_already_in_use": + await interaction.response.send_message(f"# :man_gesturing_no: そのキーボードは他のメンバーによって使用されています。\n別のキーボードのデバイス番号を指定して、再度お試しください。", ephemeral=True) + elif register["about"] == "mouse_already_in_use": + await interaction.response.send_message(f"# :man_gesturing_no: そのマウスは他のメンバーによって使用されています。\n別のマウスのデバイス番号を指定して、再度お試しください。", ephemeral=True) + elif register["about"] == "user_data_not_found": + await interaction.response.send_message("# :dizzy_face: ユーザーとして登録されていないようです。\n最初にサーバーで登録を行ってください。", ephemeral=True) + else: + await interaction.response.send_message("# :skull_crossbones: 登録できませんでした。\n内部エラーが発生しています。", ephemeral=True) + dislocker = DL() @@ -718,6 +779,154 @@ async def on_ready(): print("------") await tree.sync() +@client.event +async def on_button(interaction: discord.Interaction): + custom_id = interaction.data["custom_id"] + custom_id_split = custom_id.split("_") + dislocker.log(title=f"[INFO] ボタンが押されました。", message=f"custom_id | {custom_id}, DiscordユーザーID | {interaction.user.id}", flag=0) + + if custom_id_split[0] == "pcregister": + keyboard_register_view = discord.ui.View(timeout=15) + pc_number = custom_id_split[1] + for i in dislocker.keyboard_list: + keyboard_register_button = discord.ui.Button(style=discord.ButtonStyle.primary, label=f"{str(i)}", custom_id=f"keyboardregister_{str(pc_number)}_{str(i)}") + keyboard_register_view.add_item(keyboard_register_button) + keyboard_not_register_button = discord.ui.Button(style=discord.ButtonStyle.primary, label="キーボードは自前", custom_id=f"keyboardregister_{str(pc_number)}_own") + keyboard_register_view.add_item(keyboard_not_register_button) + + await interaction.response.send_message(f"# :keyboard: キーボードのデバイス番号を選んでください!\n>>> # PC番号 | {str(pc_number)}", view=keyboard_register_view, ephemeral=True) + + elif custom_id_split[0] == "keyboardregister": + mouse_register_view = discord.ui.View(timeout=15) + pc_number = custom_id_split[1] + keyboard_number = custom_id_split[2] + if keyboard_number == "own": + keyboard_number_show = "自前" + else: + keyboard_number_show = keyboard_number + for i in dislocker.mouse_list: + mouse_register_button = discord.ui.Button(style=discord.ButtonStyle.primary, label=f"{str(i)}", custom_id=f"mouseregister_{str(pc_number)}_{str(keyboard_number)}_{str(i)}") + mouse_register_view.add_item(mouse_register_button) + mouse_not_register_button = discord.ui.Button(style=discord.ButtonStyle.primary, label="マウスは自前", custom_id=f"mouseregister_{str(pc_number)}_{str(keyboard_number)}_own") + mouse_register_view.add_item(mouse_not_register_button) + + await interaction.response.send_message(f"# :mouse_three_button: マウスのデバイス番号を選んでください!\n>>> # PC番号 | {str(pc_number)}\n# キーボード番号 | {str(keyboard_number_show)}", view=mouse_register_view, ephemeral=True) + + elif custom_id_split[0] == "mouseregister": + pc_number = custom_id_split[1] + keyboard_number = custom_id_split[2] + mouse_number = custom_id_split[3] + + if keyboard_number == "own": + keyboard_number_show = "自前" + else: + keyboard_number_show = keyboard_number + + if mouse_number == "own": + mouse_number_show = "自前" + else: + mouse_number_show = mouse_number + + reason_register_view = discord.ui.View(timeout=15) + for i in dislocker.preset_games: + reason_quick_button = reason_button = discord.ui.Button(style=discord.ButtonStyle.primary, label=f"{str(i)}", custom_id=f"quickreasonregister_{str(pc_number)}_{str(keyboard_number)}_{str(mouse_number)}_{str(i)}") + reason_register_view.add_item(reason_quick_button) + reason_button = discord.ui.Button(style=discord.ButtonStyle.primary, label="使用目的を入力する", custom_id=f"reasonregister_{str(pc_number)}_{str(keyboard_number)}_{str(mouse_number)}") + reason_register_view.add_item(reason_button) + + await interaction.response.send_message(f"# :regional_indicator_q: 使用目的を書いてください!\n>>> # PC番号 | {str(pc_number)}\n# キーボード番号 | {str(keyboard_number_show)}\n# マウス番号 | {str(mouse_number_show)}", view=reason_register_view, ephemeral=True) + + elif custom_id_split[0] == "quickreasonregister": + pc_number = custom_id_split[1] + keyboard_number = custom_id_split[2] + mouse_number = custom_id_split[3] + + if keyboard_number == "own": + keyboard_number_show = "自前" + else: + keyboard_number_show = keyboard_number + + if mouse_number == "own": + mouse_number_show = "自前" + else: + mouse_number_show = mouse_number + + reason = custom_id_split[4] + + register = dislocker.register(discord_user_id=interaction.user.id, name=interaction.user.name, display_name=interaction.user.display_name, pc_number=pc_number, keyboard_number=keyboard_number, mouse_number=mouse_number, detail=reason) + if register["about"] == "ok": + await interaction.response.send_message(f":white_check_mark: 使用が開始されました。\n>>> # パスワード | {register["output_dict"]["password"]}\n## PC番号 | {pc_number}\n## キーボード番号 | {str(keyboard_number_show)}\n## マウス番号 | {str(mouse_number_show)}\n## 使用目的 | {reason}", ephemeral=True) + await client.get_channel(dislocker.server_config["bot"]["log_channel_id"]).send(f':white_check_mark: {register["output_dict"]["name"]} さんがPC {pc_number} の使用を開始しました。\n>>> ## PC番号 | {pc_number}\n## 使用目的 | {reason}') + dislocker.log(title=f"[INFO] PC番号{pc_number} の使用が開始されました。", message=f"名前 | {register["output_dict"]["name"]}, 使用目的 | {reason}", flag=0) + elif register["about"] == "pc_already_in_use_by_you": + pc_usage_history = register["pc_usage_history"] + if pc_usage_history["keyboard_number"] == None: + keyboard_number_show = "未認証" + elif pc_usage_history["keyboard_number"] == 0: + keyboard_number_show = "自前" + else: + keyboard_number_show = str(pc_usage_history["keyboard_number"]) + + if pc_usage_history["mouse_number"] == None: + mouse_number_show = "未認証" + elif pc_usage_history["mouse_number"] == 0: + mouse_number_show = "自前" + else: + mouse_number_show = str(pc_usage_history["mouse_number"]) + await interaction.response.send_message(f"# :exploding_head: あなたはPCをもう使用されているようです。\n使用状態を解除するには 終了ボタン で使用終了をお知らせください。\n>>> # PC番号 | {pc_usage_history["pc_number"]}\n# キーボード番号 | {keyboard_number_show}\n# マウス番号 | {mouse_number_show}\n# 使用開始時刻 | {pc_usage_history["start_time"]}", ephemeral=True) + #await interaction.response.send_message(f"# :exploding_head: あなたはPCをもう使用されているようです。\n使用状態を解除するには 終了ボタン で使用終了をお知らせください。\n>>> # PC番号 | {pc_usage_history["pc_number"]}\n# キーボード番号 | {keyboard_number_show}\n# マウス番号 | {mouse_number_show}\n# 使用開始時刻 | {pc_usage_history["start_time"]}\n# 使用目的 | {pc_usage_history["use_detail"]}", ephemeral=True) + elif register["about"] == "pc_already_in_use_by_other": + await interaction.response.send_message(f"# :man_gesturing_no: そのPCは他のメンバーによって使用されています。\n別のPC番号を指定して、再度お試しください。", ephemeral=True) + elif register["about"] == "keyboard_already_in_use": + await interaction.response.send_message(f"# :man_gesturing_no: そのキーボードは他のメンバーによって使用されています。\n別のキーボードのデバイス番号を指定して、再度お試しください。", ephemeral=True) + elif register["about"] == "mouse_already_in_use": + await interaction.response.send_message(f"# :man_gesturing_no: そのマウスは他のメンバーによって使用されています。\n別のマウスのデバイス番号を指定して、再度お試しください。", ephemeral=True) + elif register["about"] == "user_data_not_found": + await interaction.response.send_message("# :dizzy_face: ユーザーとして登録されていないようです。\n最初にサーバーで登録を行ってください。", ephemeral=True) + else: + await interaction.response.send_message("# :skull_crossbones: 登録できませんでした。\n内部エラーが発生しています。", ephemeral=True) + + elif custom_id_split[0] == "reasonregister": + pc_number = custom_id_split[1] + keyboard_number = custom_id_split[2] + mouse_number = custom_id_split[3] + + if keyboard_number == "own": + keyboard_number_show = "自前" + else: + keyboard_number_show = keyboard_number + + if mouse_number == "own": + mouse_number_show = "自前" + else: + mouse_number_show = mouse_number + + reason_input_form = ReasonModal(title="Dislocker | 登録", pc_number=str(pc_number), keyboard_number=str(keyboard_number), mouse_number=str(mouse_number)) + await interaction.response.send_modal(reason_input_form) + + elif custom_id_split[0] == "stop": + pc_stop = dislocker.stop(discord_user_id=interaction.user.id) + stop_view = discord.ui.View(timeout=15) + if pc_stop["about"] == "unused": + await interaction.response.send_message("# :shaking_face: 使用されていないようです...", ephemeral=True) + elif pc_stop["about"] == "user_data_not_found": + await interaction.response.send_message("# :dizzy_face: ユーザーとして登録されていないようです。\n最初にサーバーで登録を行ってください。", ephemeral=True) + elif pc_stop["about"] == "ok": + await interaction.response.send_message(f":white_check_mark: PC番号 {pc_stop["output_dict"]["pc_number"]} の使用が終了されました。", ephemeral=True) + await client.get_channel(dislocker.server_config["bot"]["log_channel_id"]).send(f':negative_squared_cross_mark: {pc_stop["output_dict"]["name"]} さんがPC {pc_stop["output_dict"]["pc_number"]} の使用を終了しました。') + else: + await interaction.response.send_message("# :skull_crossbones: 停止できませんでした。\n内部エラーが発生しています。", ephemeral=True) + + elif custom_id_split[0] == "user" and custom_id_split[1] == "register": + user_register = dislocker.user_register(name=interaction.user.display_name, discord_user_name=interaction.user.name, discord_user_id=interaction.user.id) + if user_register["about"] == "ok": + await interaction.response.send_message(f"# :white_check_mark: ユーザー情報が登録されました。\n>>> ユーザー名:{interaction.user.display_name}", ephemeral=True) + elif user_register["about"] == "already_exists": + await interaction.response.send_message("# :no_entry: 登録できませんでした。\nもう登録されている可能性があります。", ephemeral=True) + else: + await interaction.response.send_message("# :no_entry: 登録できませんでした。\n内部エラーが発生しています。", ephemeral=True) + + #使用者側のスラッシュコマンド @tree.command(name="use", description="パソコンの使用登録をします。通常はこのコマンドを使用する必要はありません。") async def use(interaction: discord.Interaction, pc_number: int, keyboard_number: int, mouse_number: int, detail: str): @@ -812,6 +1021,28 @@ async def report(interaction: discord.Interaction): if report_export["about"] == "error": await interaction.response.send_message(":x: 内部エラーが発生しました。\nサーバーでエラーが発生しています。管理者に問い合わせてください。", ephemeral=True) +@tree.command(name="init", description="操作チャンネルにボタン一式を送信します。") +async def button_init(interaction: discord.Interaction, text_channel: discord.TextChannel): + user_register_button_view = discord.ui.View(timeout=None) + user_register_button = discord.ui.Button(style=discord.ButtonStyle.green, label="ユーザー登録", custom_id="user_register") + user_register_button_view.add_item(user_register_button) + + await client.get_channel(text_channel.id).send(f'# :index_pointing_at_the_viewer: ユーザー登録はお済ですか?', view=user_register_button_view) + + stop_button_view = discord.ui.View(timeout=None) + stop_button = discord.ui.Button(style=discord.ButtonStyle.danger, label="PCの使用を停止", custom_id="stop") + stop_button_view.add_item(stop_button) + + await client.get_channel(text_channel.id).send(f'# :index_pointing_at_the_viewer: 使用を停止しますか?', view=stop_button_view) + + pc_button_view = discord.ui.View(timeout=None) + for i in dislocker.pc_list: + pc_register_button = discord.ui.Button(style=discord.ButtonStyle.primary, label=f"{str(i)}", custom_id=f"pcregister_{str(i)}") + pc_button_view.add_item(pc_register_button) + + await client.get_channel(text_channel.id).send(f'# :index_pointing_at_the_viewer: 使いたいPCの番号を選んでください!', view=pc_button_view) + dislocker.log(title=f"[INFO] サーバーで初回処理を実行しました。", flag=0) + client.run(dislocker.server_config["bot"]["token"]) \ No newline at end of file