diff --git a/dislocker_slash.py b/dislocker_slash.py index 1996671..a668adf 100644 --- a/dislocker_slash.py +++ b/dislocker_slash.py @@ -640,6 +640,64 @@ class DL(): finally: if cursor: cursor.close() + + def pc_onetime_gen(self): + try: + if os.path.isfile(dislocker.onetime_config_path): + with open(dislocker.onetime_config_path, "r") as r: + onetime_config = json.load(r) + onetime = onetime_config["onetime"]["pc_register"] + if onetime == None: + onetime = str(self.password_generate(8)) + onetime_config["onetime"]["pc_register"] = onetime + with open(dislocker.onetime_config_path, "w") as w: + json.dump(onetime_config, w, indent=4) + return {"result": 0, "about": "ok", "onetime": onetime} + else: + return {"result": 0, "already_exists": "ok", "onetime": onetime} + else: + onetime = str(self.password_generate(8)) + onetime_config = { + "onetime": { + "pc_register": onetime, + "device_register": None + } + } + with open(dislocker.onetime_config_path, "w") as w: + json.dump(onetime_config, w, indent=4) + return {"result": 0, "about": "ok", "onetime": onetime} + except Exception as error: + self.log(title=f"[ERROR] PC登録用のワンタイムパスワードを発行中にエラーが発生しました。 {str(error.__class__.__name__)}", message=str(error.args), flag=1) + return {"result": 1, "about": "error"} + + def device_onetime_gen(self): + try: + if os.path.isfile(dislocker.onetime_config_path): + with open(dislocker.onetime_config_path, "r") as r: + onetime_config = json.load(r) + onetime = onetime_config["onetime"]["device_register"] + if onetime == None: + onetime = str(self.password_generate(8)) + onetime_config["onetime"]["device_register"] = onetime + with open(dislocker.onetime_config_path, "w") as w: + json.dump(onetime_config, w, indent=4) + return {"result": 0, "about": "ok", "onetime": onetime} + else: + return {"result": 0, "already_exists": "ok", "onetime": onetime} + else: + onetime = str(self.password_generate(8)) + onetime_config = { + "onetime": { + "pc_register": None, + "device_register": onetime + } + } + with open(dislocker.onetime_config_path, "w") as w: + json.dump(onetime_config, w, indent=4) + return {"result": 0, "about": "ok", "onetime": onetime} + except Exception as error: + self.log(title=f"[ERROR] デバイス登録用のワンタイムパスワードを発行中にエラーが発生しました。 {str(error.__class__.__name__)}", message=str(error.args), flag=1) + return {"result": 1, "about": "error"} dislocker = DL() @@ -658,6 +716,7 @@ async def on_ready(): print("------") await tree.sync() +#使用者側のスラッシュコマンド @tree.command(name="use", description="パソコンの使用登録をします。通常はこのコマンドを使用する必要はありません。") async def use(interaction: discord.Interaction, pc_number: int, keyboard_number: int, mouse_number: int, detail: str): 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=detail) @@ -694,5 +753,63 @@ async def stop(interaction: discord.Interaction): elif stop["about"] == "error": await interaction.response.send_message("# :skull_crossbones: 停止できませんでした。\n内部エラーが発生しています。", ephemeral=True) +#管理者側のスラッシュコマンド +@tree.command(name="userreg", description="ユーザーを登録します。") +async def userreg(interaction: discord.Interaction, discord_user_id: str, discord_user_name: str, name: str): + user_register = dislocker.user_register(discord_user_id=discord_user_id, discord_user_name=discord_user_name, name=name) + if user_register["result"] == 0: + await interaction.response.send_message(":white_check_mark: ユーザーを登録しました。", ephemeral=True) + dislocker.log(title=f"[INFO] ユーザーを登録しました。", message=f"名前 | {name}, Discordユーザー名 | {discord_user_name}, DiscordユーザーID | {discord_user_id}", flag=0) + elif user_register["result"] == 1: + if user_register["about"] == "already_exists": + await interaction.response.send_message(":x: 既に登録されているユーザーです。", ephemeral=True) + elif user_register["about"] == "error": + await interaction.response.send_message(":x: 内部エラーが発生しました。\nサーバーでエラーが発生しています。管理者に問い合わせてください。", ephemeral=True) + +@tree.command(name="pcreg", description="PCを登録するためのワンタイムパスワードを発行します。") +async def pcreg(interaction: discord.Interaction): + onetime = dislocker.pc_onetime_gen() + if onetime["result"] == 0: + await interaction.response.send_message(f":white_check_mark: PC登録用のワンタイムパスワードを発行しました。\n>>> # ワンタイムパスワード | {onetime['onetime']}\n## 有効期限 | 1回の登録でのみ使用可能です。", ephemeral=True) + dislocker.log(title=f"[INFO] PC登録用のワンタイムパスワードを発行しました。", message=f"ワンタイムパスワード | {onetime['onetime']}", flag=0) + elif onetime["result"] == 1: + if onetime["about"] == "error": + await interaction.response.send_message(":x: 内部エラーが発生しました。\nサーバーでエラーが発生しています。管理者に問い合わせてください。", ephemeral=True) + +@tree.command(name="devicereg", description="デバイスを登録するためのワンタイムパスワードを発行します。") +async def devicereg(interaction: discord.Interaction): + onetime = dislocker.device_onetime_gen() + if onetime["result"] == 0: + await interaction.response.send_message(f":white_check_mark: デバイス登録用のワンタイムパスワードを発行しました。\n>>> # ワンタイムパスワード | {onetime['onetime']}\n## 有効期限 | 1回の登録でのみ使用可能です。", ephemeral=True) + dislocker.log(title=f"[INFO] デバイス登録用のワンタイムパスワードを発行しました。", message=f"ワンタイムパスワード | {onetime['onetime']}", flag=0) + elif onetime["result"] == 1: + if onetime["about"] == "error": + await interaction.response.send_message(":x: 内部エラーが発生しました。\nサーバーでエラーが発生しています。管理者に問い合わせてください。", ephemeral=True) + +@tree.command(name="fstop", description="PCの使用を強制終了します。") +async def fstop(interaction: discord.Interaction, pc_number: int, bot_about: str): + force_stop = dislocker.force_stop(pc_number=pc_number, bot_about=bot_about) + if force_stop["result"] == 0: + await interaction.response.send_message(f":white_check_mark: PC {pc_number} の使用を強制終了しました。", ephemeral=True) + dislocker.log(title=f"[INFO] PC {pc_number} の使用を強制終了しました。", message=f"理由 | {bot_about}", flag=0) + elif force_stop["result"] == 1: + if force_stop["about"] == "not_used": + await interaction.response.send_message(":x: そのPCは使用されていません。", ephemeral=True) + elif force_stop["about"] == "bot_about_not_found": + await interaction.response.send_message(":x: 理由が指定されていません。", ephemeral=True) + elif force_stop["about"] == "error": + await interaction.response.send_message(":x: 内部エラーが発生しました。\nサーバーでエラーが発生しています。管理者に問い合わせてください。", ephemeral=True) + +@tree.command(name="report", description="PCの使用履歴をエクスポートします。") +async def report(interaction: discord.Interaction): + report_export = dislocker.report_export() + if report_export["result"] == 0: + await interaction.response.send_message(f":white_check_mark: 使用履歴のレポートです。", file=discord.File(report_export["file_path"]), ephemeral=True) + dislocker.log(title=f"[INFO] PCの使用履歴をエクスポートしました。", message=f"ファイルパス | {report_export['file_path']}", flag=0) + elif report_export["result"] == 1: + if report_export["about"] == "error": + await interaction.response.send_message(":x: 内部エラーが発生しました。\nサーバーでエラーが発生しています。管理者に問い合わせてください。", ephemeral=True) + + client.run(dislocker.server_config["bot"]["token"]) \ No newline at end of file