Compare commits
No commits in common. "a9109dba0a9ae9c08870d1e8421113dc31c9ffd6" and "707e2e3ed6886c6a52285d1372fdb20797aae6b9" have entirely different histories.
a9109dba0a
...
707e2e3ed6
461
dislocker.py
|
@ -1,17 +1,13 @@
|
|||
import json
|
||||
import discord
|
||||
from discord import Interaction, TextStyle, app_commands
|
||||
from discord.ui import TextInput, View, Modal
|
||||
import os
|
||||
import psycopg2
|
||||
from psycopg2 import sql
|
||||
import hashlib
|
||||
import string
|
||||
import random
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime
|
||||
from openpyxl import Workbook
|
||||
import threading
|
||||
import time
|
||||
|
||||
class DL():
|
||||
def __init__(self):
|
||||
|
@ -36,8 +32,7 @@ class DL():
|
|||
"bot": {
|
||||
"token": "TYPE HERE BOTS TOKEN KEY",
|
||||
"log_channel_id" : "TYPE HERE CHANNEL ID (YOU MUST USE INT !!!!)",
|
||||
"config_channel_id": "TYPE HERE CHANNEL ID (YOU MUST USE INT !!!!)",
|
||||
"config_public_channel_id": "TYPE HERE CHANNEL ID (YOU MUST USE INT !!!!)"
|
||||
"config_channel_id": "TYPE HERE CHANNEL ID (YOU MUST USE INT !!!!)"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -60,33 +55,6 @@ class DL():
|
|||
self.init_result = "not_int"
|
||||
else:
|
||||
self.db = psycopg2.connect(f"host={self.server_config['db']['host']} dbname={self.server_config['db']['db_name']} port={self.server_config['db']['port']} user={self.server_config['db']['username']} password={self.server_config['db']['password']}")
|
||||
cursor = self.db.cursor()
|
||||
|
||||
cursor.execute("SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'club_member')")
|
||||
find_club_member_table = cursor.fetchall()
|
||||
print(find_club_member_table)
|
||||
if find_club_member_table[0][0] == False:
|
||||
cursor.execute("CREATE TABLE club_member (id SERIAL NOT NULL, name VARCHAR(30) NOT NULL, discord_username VARCHAR(32) NOT NULL, discord_userid VARCHAR(18) NOT NULL, PRIMARY KEY (id))")
|
||||
self.db.commit()
|
||||
|
||||
cursor.execute("SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'pc_list')")
|
||||
find_pc_list_table = cursor.fetchall()
|
||||
print(find_pc_list_table)
|
||||
if find_pc_list_table[0][0] == False:
|
||||
cursor.execute("CREATE TABLE pc_list (pc_number INTEGER NOT NULL, using_user_id INTEGER, password_hash VARCHAR(32), PRIMARY KEY (pc_number), FOREIGN KEY (using_user_id) REFERENCES club_member(id))")
|
||||
for i in range(10):
|
||||
print(i)
|
||||
cursor.execute("INSERT INTO pc_list (pc_number) VALUES (%s)", (i + 1,))
|
||||
self.db.commit()
|
||||
|
||||
cursor.execute("SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'pc_usage_history')")
|
||||
find_pc_usage_history_table = cursor.fetchall()
|
||||
print(find_pc_usage_history_table)
|
||||
if find_pc_usage_history_table[0][0] == False:
|
||||
cursor.execute("CREATE TABLE pc_usage_history (id SERIAL NOT NULL, member_id INTEGER NOT NULL, pc_number INTEGER NOT NULL, device_number INTEGER NOT NULL, start_use_time TIMESTAMP NOT NULL, end_use_time TIMESTAMP, use_detail VARCHAR(30), PRIMARY KEY (id), FOREIGN KEY (member_id) REFERENCES club_member(id), FOREIGN KEY (pc_number) REFERENCES pc_list(pc_number))")
|
||||
self.db.commit()
|
||||
|
||||
cursor.close()
|
||||
self.init_result = "ok"
|
||||
|
||||
except (Exception) as error:
|
||||
|
@ -98,7 +66,6 @@ class DL():
|
|||
|
||||
|
||||
class Bot(discord.Client):
|
||||
|
||||
def password_generate(self, length):
|
||||
numbers = string.digits # (1)
|
||||
password = ''.join(random.choice(numbers) for _ in range(length)) # (2)
|
||||
|
@ -110,25 +77,20 @@ class Bot(discord.Client):
|
|||
|
||||
def register(self, **kwargs):
|
||||
try:
|
||||
user_info = {
|
||||
"id": str(kwargs["user_id"]),
|
||||
"name": str(kwargs["name"]),
|
||||
"display_name": str(kwargs["display_name"]),
|
||||
"pc_number": int(kwargs["pc_number"]),
|
||||
"device_number": int(kwargs["device_number"]),
|
||||
"detail": None
|
||||
}
|
||||
discord_user_id = str(kwargs["user_id"])
|
||||
pc_number = int(kwargs["pc_number"])
|
||||
device_number = int(kwargs["device_number"])
|
||||
if "detail" in kwargs:
|
||||
user_info["detail"] = str(kwargs["detail"])
|
||||
detail = str(kwargs["detail"])
|
||||
else:
|
||||
pass
|
||||
detail = None
|
||||
#パスワード生成、ハッシュ化
|
||||
password = self.password_generate(4)
|
||||
password_hash = self.hash_genarate(password)
|
||||
print("password generated")
|
||||
#メンバーリストと送信者を照合
|
||||
cursor = dislocker.db.cursor()
|
||||
cursor.execute("SELECT * FROM club_member WHERE discord_userid = %s", (user_info["id"],))
|
||||
cursor.execute("SELECT * FROM club_member WHERE discord_userid = %s", (discord_user_id,))
|
||||
user_record = cursor.fetchall()
|
||||
#ユーザーデータがなかったら(未登録の場合)
|
||||
if not user_record:
|
||||
|
@ -143,57 +105,39 @@ class Bot(discord.Client):
|
|||
if pc_usage_history_record[0][5] == None:
|
||||
result = {"result": "pc_already_in_use_by_you", "pc_number": str(pc_usage_history_record[0][2]), "device_number": str(pc_usage_history_record[0][3]), "start_time": str(pc_usage_history_record[0][4]), "detail": str(pc_usage_history_record[0][6])}
|
||||
else:
|
||||
cursor.execute("SELECT * FROM pc_list WHERE pc_number=%s", (user_info["pc_number"],))
|
||||
cursor.execute("SELECT * FROM pc_list WHERE pc_number=%s", (pc_number,))
|
||||
pc_list_record = cursor.fetchall()
|
||||
if not pc_list_record[0][1] == None:
|
||||
result = {"result": "pc_already_in_use_by_other"}
|
||||
else:
|
||||
if user_info["detail"] == None:
|
||||
cursor.execute("INSERT INTO pc_usage_history (member_id, pc_number, device_number, start_use_time) VALUES (%s, %s, %s, current_timestamp)", (user_record[0][0], user_info["pc_number"], user_info["device_number"]))
|
||||
if detail == None:
|
||||
cursor.execute("INSERT INTO pc_usage_history (member_id, pc_number, device_number, start_use_time) VALUES (%s, %s, %s, current_timestamp)", (user_record[0][0], pc_number, device_number))
|
||||
#使用用途があるとき
|
||||
else:
|
||||
cursor.execute("INSERT INTO pc_usage_history (member_id, pc_number, device_number, start_use_time, use_detail) VALUES (%s, %s, %s, current_timestamp, %s)", (user_record[0][0], user_info["pc_number"], user_info["device_number"], user_info["detail"]))
|
||||
cursor.execute("INSERT INTO pc_usage_history (member_id, pc_number, device_number, start_use_time, use_detail) VALUES (%s, %s, %s, current_timestamp, %s)", (user_record[0][0], pc_number, device_number, detail))
|
||||
|
||||
cursor.execute("UPDATE pc_list SET using_user_id = %s WHERE pc_number = %s", (user_record[0][0], user_info["pc_number"]))
|
||||
cursor.execute("UPDATE pc_list SET password_hash = %s WHERE pc_number = %s", (password_hash, user_info["pc_number"]))
|
||||
cursor.execute("UPDATE pc_list SET using_user_id = %s WHERE pc_number = %s", (user_record[0][0], pc_number))
|
||||
cursor.execute("UPDATE pc_list SET password_hash = %s WHERE pc_number = %s", (password_hash, pc_number))
|
||||
dislocker.db.commit()
|
||||
result = {"result": "ok", "password": str(password), "name": str(user_record[0][1])}
|
||||
else:
|
||||
print("unused")
|
||||
cursor.execute("SELECT * FROM pc_list WHERE pc_number=%s", (user_info["pc_number"],))
|
||||
cursor.execute("SELECT * FROM pc_list WHERE pc_number=%s", (pc_number,))
|
||||
pc_list_record = cursor.fetchall()
|
||||
if pc_list_record:
|
||||
if not pc_list_record[0][1] == None:
|
||||
result = {"result": "pc_already_in_use_by_other"}
|
||||
else:
|
||||
if user_info["detail"] == None:
|
||||
cursor.execute("INSERT INTO pc_usage_history (member_id, pc_number, device_number, start_use_time) VALUES (%s, %s, %s, current_timestamp)", (user_record[0][0], user_info["pc_number"], user_info["device_number"]))
|
||||
if detail == None:
|
||||
cursor.execute("INSERT INTO pc_usage_history (member_id, pc_number, device_number, start_use_time) VALUES (%s, %s, %s, current_timestamp)", (user_record[0][0], pc_number, device_number))
|
||||
#使用用途があるとき
|
||||
else:
|
||||
cursor.execute("INSERT INTO pc_usage_history (member_id, pc_number, device_number, start_use_time, use_detail) VALUES (%s, %s, %s, current_timestamp, %s)", (user_record[0][0], user_info["pc_number"], user_info["device_number"], user_info["detail"]))
|
||||
cursor.execute("INSERT INTO pc_usage_history (member_id, pc_number, device_number, start_use_time, use_detail) VALUES (%s, %s, %s, current_timestamp, %s)", (user_record[0][0], pc_number, device_number, detail))
|
||||
|
||||
cursor.execute("UPDATE pc_list SET using_user_id = %s WHERE pc_number = %s", (user_record[0][0], user_info["pc_number"]))
|
||||
cursor.execute("UPDATE pc_list SET password_hash = %s WHERE pc_number = %s", (password_hash, user_info["pc_number"]))
|
||||
cursor.execute("UPDATE pc_list SET using_user_id = %s WHERE pc_number = %s", (user_record[0][0], pc_number))
|
||||
cursor.execute("UPDATE pc_list SET password_hash = %s WHERE pc_number = %s", (password_hash, pc_number))
|
||||
dislocker.db.commit()
|
||||
result = {"result": "ok", "password": str(password), "name": str(user_record[0][1])}
|
||||
else:
|
||||
if user_info["detail"] == None:
|
||||
cursor.execute("INSERT INTO pc_usage_history (member_id, pc_number, device_number, start_use_time) VALUES (%s, %s, %s, current_timestamp)", (user_record[0][0], user_info["pc_number"], user_info["device_number"]))
|
||||
#使用用途があるとき
|
||||
else:
|
||||
cursor.execute("INSERT INTO pc_usage_history (member_id, pc_number, device_number, start_use_time, use_detail) VALUES (%s, %s, %s, current_timestamp, %s)", (user_record[0][0], user_info["pc_number"], user_info["device_number"], user_info["detail"]))
|
||||
|
||||
cursor.execute("UPDATE pc_list SET using_user_id = %s WHERE pc_number = %s", (user_record[0][0], user_info["pc_number"]))
|
||||
cursor.execute("UPDATE pc_list SET password_hash = %s WHERE pc_number = %s", (password_hash, user_info["pc_number"]))
|
||||
dislocker.db.commit()
|
||||
result = {"result": "ok", "password": str(password), "name": str(user_record[0][1])}
|
||||
|
||||
|
||||
except Exception as error:
|
||||
print("登録処理中にエラーが発生しました。\nエラー内容")
|
||||
print(str(error.__class__.__name__))
|
||||
print(str(error.args))
|
||||
print(str(error))
|
||||
except:
|
||||
print("登録処理中にエラーが発生しました。")
|
||||
result = {"result": "error"}
|
||||
|
||||
finally:
|
||||
|
@ -240,11 +184,8 @@ class Bot(discord.Client):
|
|||
else:
|
||||
result = {"result": "already_exists"}
|
||||
|
||||
except Exception as error:
|
||||
print("ユーザー登録中にエラーが発生しました。\nエラー内容")
|
||||
print(str(error.__class__.__name__))
|
||||
print(str(error.args))
|
||||
print(str(error))
|
||||
except:
|
||||
print("ユーザー登録中にエラーが発生しました。")
|
||||
result = {"result": "error"}
|
||||
|
||||
finally:
|
||||
|
@ -256,30 +197,6 @@ class Bot(discord.Client):
|
|||
return value.strftime('%Y-%m-%d %H:%M:%S')
|
||||
return value
|
||||
|
||||
def pc_register(self, **kwargs):
|
||||
try:
|
||||
pc_number = int(kwargs["pc_number"])
|
||||
cursor = dislocker.db.cursor()
|
||||
cursor.execute("SELECT * FROM pc_list WHERE pc_number = %s", (pc_number,))
|
||||
pc_list = cursor.fetchall()
|
||||
if not pc_list:
|
||||
cursor.execute("INSERT INTO pc_list (pc_number) VALUES (%s)", (pc_number,))
|
||||
dislocker.db.commit()
|
||||
result = {"result": "ok"}
|
||||
else:
|
||||
result = {"result": "already_exists"}
|
||||
|
||||
except Exception as error:
|
||||
print("PCの登録中にエラーが発生しました。\nエラー内容")
|
||||
print(str(error.__class__.__name__))
|
||||
print(str(error.args))
|
||||
print(str(error))
|
||||
result = {"result": "error"}
|
||||
|
||||
finally:
|
||||
cursor.close()
|
||||
return result
|
||||
|
||||
def report_export(self, **kwargs):
|
||||
try:
|
||||
cursor = dislocker.db.cursor()
|
||||
|
@ -379,36 +296,9 @@ class Bot(discord.Client):
|
|||
cursor.close()
|
||||
return result
|
||||
|
||||
|
||||
async def timeout_notify(self, **kwargs):
|
||||
try:
|
||||
pc_number = kwargs["pc_number"]
|
||||
discord_display_name = kwargs["discord_display_name"]
|
||||
|
||||
await self.get_channel(dislocker.server_config["bot"]["log_channel_id"]).send(f':negative_squared_cross_mark: {discord_display_name} さんのPC {pc_number} の使用登録はタイムアウトにより解除されました。')
|
||||
result = {"result": "ok"}
|
||||
|
||||
except Exception as error:
|
||||
print("自動停止処理中にエラーが発生しました。\nエラー内容")
|
||||
print(str(error.__class__.__name__))
|
||||
print(str(error.args))
|
||||
print(str(error))
|
||||
result = {"result": "error"}
|
||||
|
||||
finally:
|
||||
return result
|
||||
|
||||
|
||||
async def on_ready(self):
|
||||
print("DiscordのBotが起動しました。")
|
||||
|
||||
async def on_interaction(self, interaction:discord.Interaction):
|
||||
try:
|
||||
if interaction.data["component_type"] == 2:
|
||||
await self.on_button(interaction)
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
async def on_message(self, message):
|
||||
if message.author.bot:
|
||||
pass
|
||||
|
@ -418,7 +308,7 @@ class Bot(discord.Client):
|
|||
if msg_split[0] == "/password" or msg_split[0] == "/start":
|
||||
#メッセージの要素が2つ以下の場合は拒否
|
||||
if len(msg_split) <= 2:
|
||||
await message.channel.send("# :warning: PC番号、もしくはデバイス番号が入力されていません。")
|
||||
await message.channel.send("PC番号、もしくはデバイス番号が入力されていません。")
|
||||
#メッセージの要素が3つ以上の場合
|
||||
elif len(msg_split) >= 3:
|
||||
#番号が数字であることを確認
|
||||
|
@ -426,329 +316,80 @@ class Bot(discord.Client):
|
|||
#PC番号が1以上10以下であることを確認
|
||||
if int(msg_split[1]) <= 10 and int(msg_split[1]) >= 1:
|
||||
if len(msg_split) == 3:
|
||||
register = self.register(user_id=message.author.id, name=message.author.name, display_name=message.author.display_name, pc_number=msg_split[1], device_number=msg_split[2])
|
||||
register = self.register(user_id=message.author.id, pc_number=msg_split[1], device_number=msg_split[2])
|
||||
elif len(msg_split) == 4:
|
||||
register = self.register(user_id=message.author.id, name=message.author.name, display_name=message.author.display_name, pc_number=msg_split[1], device_number=msg_split[2], detail=msg_split[3])
|
||||
register = self.register(user_id=message.author.id, pc_number=msg_split[1], device_number=msg_split[2], detail=msg_split[3])
|
||||
|
||||
if register["result"] == "ok":
|
||||
if len(msg_split) == 3:
|
||||
await message.channel.send(f":white_check_mark: 使用が開始されました。\n>>> # パスワード | {register["password"]}\n## PC番号 | {msg_split[1]}\n## デバイス番号 | {msg_split[2]}")
|
||||
await message.channel.send(f"使用が開始されました。\nパスワード | {register["password"]}\nPC番号 | {msg_split[1]}\nデバイス番号 | {msg_split[2]}")
|
||||
elif len(msg_split) == 4:
|
||||
await message.channel.send(f":white_check_mark: 使用が開始されました。\n>>> # パスワード | {register["password"]}\n## PC番号 | {msg_split[1]}\n## デバイス番号 | {msg_split[2]}\n## 使用目的 | {msg_split[3]}")
|
||||
await self.get_channel(dislocker.server_config["bot"]["log_channel_id"]).send(f':white_check_mark: {register["name"]} さんがPC {msg_split[1]} の使用を開始しました。')
|
||||
await message.channel.send(f"使用が開始されました。\nパスワード | {register["password"]}\nPC番号 | {msg_split[1]}\nデバイス番号 | {msg_split[2]}\n使用目的 | {msg_split[3]}")
|
||||
await self.get_channel(dislocker.server_config["bot"]["log_channel_id"]).send(f'{register["name"]} さんがPC {msg_split[1]} を使用しています')
|
||||
elif register["result"] == "user_data_not_found":
|
||||
await message.channel.send("# :dizzy_face: ユーザーとして登録されていないようです。\n最初にサーバーで登録を行ってください。")
|
||||
await message.channel.send("ユーザーとして登録されていないようです。管理者に問い合わせてください。")
|
||||
elif register["result"] == "pc_already_in_use_by_you":
|
||||
await message.channel.send(f"# :exploding_head: あなたはPCをもう使用されているようです。\n使用状態を解除するには /stop で使用終了をお知らせください。\n>>> # PC番号 | {register["pc_number"]}\n# デバイス番号 | {register["device_number"]}\n# 使用開始時刻 | {register["start_time"]}\n# 使用目的 | {register["detail"]}")
|
||||
await message.channel.send(f"あなたはPCをもう使用されているようです。使用状態を解除するには /stop で使用終了をお知らせください。\nPC番号 | {register["pc_number"]}\nデバイス番号 | {register["device_number"]}\n使用開始時刻 | {register["start_time"]}\n使用目的 | {register["detail"]}")
|
||||
elif register["result"] == "pc_already_in_use_by_other":
|
||||
await message.channel.send(f"# :man_gesturing_no: そのPCは他のメンバーによって使用されています。\n別のPC番号を指定して、再度お試しください。")
|
||||
await message.channel.send(f"そのPCは他のメンバーによって使用されています。別のPC番号を指定して、再度お試しください。")
|
||||
else:
|
||||
await message.channel.send("# :dizzy_face: 番号がおかしいようです。")
|
||||
await message.channel.send("番号がおかしいようです。")
|
||||
else:
|
||||
await message.channel.send("# :dizzy_face: 指定された番号は不正です。")
|
||||
await message.channel.send("指定された番号は不正です。")
|
||||
|
||||
elif msg_split[0] == "/stop":
|
||||
stop = self.stop(user_id=message.author.id)
|
||||
if stop["result"] == "unused":
|
||||
await message.channel.send("# :shaking_face: 使用されていないようです...")
|
||||
await message.channel.send("使用されていないようです...")
|
||||
elif stop["result"] == "ok":
|
||||
await message.channel.send(f":white_check_mark: PC番号 {stop["pc_number"]} の使用が終了されました。")
|
||||
await self.get_channel(dislocker.server_config["bot"]["log_channel_id"]).send(f':negative_squared_cross_mark: {stop["name"]} さんがPC {stop["pc_number"]} の使用を終了しました。')
|
||||
await message.channel.send(f"PC番号 {stop["pc_number"]} の使用が終了されました。")
|
||||
await self.get_channel(dislocker.server_config["bot"]["log_channel_id"]).send(f'{stop["name"]} さんがPC {stop["pc_number"]} の使用を終了しました')
|
||||
|
||||
elif message.channel.id == dislocker.server_config["bot"]["config_channel_id"]:
|
||||
msg_split = message.content.split()
|
||||
if msg_split[0] == "/register":
|
||||
print(len(msg_split))
|
||||
if len(msg_split) == 1:
|
||||
register = self.user_register(name=message.author.display_name, discord_user_name=message.author.name, discord_user_id=message.author.id)
|
||||
print(register)
|
||||
if register["result"] == "ok":
|
||||
await message.channel.send(f"# :white_check_mark: ユーザー情報が登録されました。\n>>> ユーザー名:{message.author.display_name}")
|
||||
elif register["result"] == "already_exists":
|
||||
await message.channel.send("# :no_entry: 登録できませんでした。\nもう登録されている可能性があります。")
|
||||
else:
|
||||
await message.channel.send("# :no_entry: 登録できませんでした。\n内部エラーが発生しています。")
|
||||
|
||||
elif len(msg_split) <= 3:
|
||||
await message.channel.send("# :japanese_goblin: 入力内容に不備があります。\n名前、Discordのユーザー名、DiscordのユーザーIDのいずれかが入力されていません。")
|
||||
if len(msg_split) <= 3:
|
||||
await message.channel.send("名前、Discordのユーザー名、DiscordのユーザーIDのいずれかが入力されていません。")
|
||||
elif len(msg_split) == 4:
|
||||
if msg_split[3].isdigit():
|
||||
register = self.user_register(name=msg_split[1], discord_user_name=msg_split[2], discord_user_id=msg_split[3])
|
||||
if register["result"] == "ok":
|
||||
await message.channel.send(f"# :white_check_mark: 登録が完了しました。\n>>> # 名前 | {msg_split[1]}\n# Discordのユーザー名 | {msg_split[2]}\n# DiscordのユーザーID | {msg_split[3]}")
|
||||
await message.channel.send(f"登録が完了しました。\n名前 | {msg_split[1]}\nDiscordのユーザー名 | {msg_split[2]}\nDiscordのユーザーID | {msg_split[3]}")
|
||||
elif register["result"] == "already_exists":
|
||||
await message.channel.send("# :skull_crossbones: 登録できませんでした。\nそのDiscordアカウントはすでに登録されています。")
|
||||
await message.channel.send("そのDiscordアカウントはすでに登録されています。")
|
||||
else:
|
||||
await message.channel.send("# :skull_crossbones: 登録できませんでした。\nDiscordのユーザーIDが不正です。")
|
||||
await message.channel.send("DiscordのユーザーIDが不正です。")
|
||||
else:
|
||||
await message.channel.send("# :skull_crossbones: 登録できませんでした。\n内部エラーが発生しています。")
|
||||
await message.channel.send("なんでかわからんけど不正です。")
|
||||
|
||||
elif msg_split[0] == "/export":
|
||||
export = self.report_export()
|
||||
if export["result"] == "ok":
|
||||
await message.channel.send("# :page_facing_up: 使用履歴のレポートです。", file=discord.File(export["file_path"]))
|
||||
await message.channel.send("使用履歴のレポートです。", file=discord.File(export["file_path"]))
|
||||
pass
|
||||
elif export["result"] == "export_error":
|
||||
await message.channel.send("# :volcano: エクスポートに失敗しました。")
|
||||
await message.channel.send("エクスポートに失敗しました。")
|
||||
|
||||
elif msg_split[0] == "/fstop":
|
||||
if len(msg_split) == 1:
|
||||
await message.channel.send("# :warning: 登録を解除できませんでした。\n使用を停止したいPC番号を指定してください。\n-# /fstop PC番号")
|
||||
await message.channel.send("PC番号を指定してください。")
|
||||
elif len(msg_split) == 2:
|
||||
if msg_split[1].isdigit():
|
||||
fstop = self.force_stop(pc_number=msg_split[1])
|
||||
if fstop["result"] == "ok":
|
||||
await message.channel.send(f"# :white_check_mark: PC番号 {msg_split[1]} の使用登録を解除しました。")
|
||||
await message.channel.send(f"PC番号 {msg_split[1]} の使用登録を解除しました。")
|
||||
elif fstop["result"] == "not_used":
|
||||
await message.channel.send("# :exploding_head: 登録を解除できませんでした。\nPCは使用されていないようです...")
|
||||
await message.channel.send("PCは使用されていないようです...")
|
||||
else:
|
||||
await message.channel.send("# :x: 登録を解除できませんでした。\n内部エラーが発生しています。")
|
||||
await message.channel.send("エラーが発生しました。")
|
||||
else:
|
||||
await message.channel.send("# :warning: 登録を解除できませんでした。\nPC番号を認識できません。\n-# 半角数字で入力してください。")
|
||||
else:
|
||||
await message.channel.send("# warning: 登録を解除できませんでした。\構文が間違っています。\n-# /fstop PC番号")
|
||||
|
||||
elif msg_split[0] == "/pcregister":
|
||||
if len(msg_split) == 1:
|
||||
await message.channel.send("# :warning: PCを登録できませんでした。\n登録したいPC番号を指定してください。\n-# 半角数字で入力してください。")
|
||||
elif len(msg_split) == 2:
|
||||
if msg_split[1].isdigit():
|
||||
pc_register = self.pc_register(pc_number=msg_split[1])
|
||||
if pc_register["result"] == "ok":
|
||||
await message.channel.send(f"# :white_check_mark: PCを登録しました。\n>>> # PC番号 | {msg_split[1]}")
|
||||
elif pc_register["result"] == "already_exists":
|
||||
await message.channel.send(f":x: PCを登録できませんでした。\nその番号のPCは既に存在します。")
|
||||
else:
|
||||
await message.channel.send("# :x: PCを登録できませんでした。\n内部エラーが発生しています。")
|
||||
else:
|
||||
await message.channel.send("# :warning: PCを登録できませんでした。\nPC番号を認識できません。\n-# 半角数字で入力してください。")
|
||||
else:
|
||||
await message.channel.send("# :warning: PCを登録できませんでした。\n構文が間違っています。\n-# /pcregister PC番号")
|
||||
|
||||
elif msg_split[0] == "/registerbutton":
|
||||
pc_button_view = View(timeout=None)
|
||||
for i in range(1, 11):
|
||||
pc_register_button = discord.ui.Button(style=discord.ButtonStyle.primary, label=f"{i}", custom_id=f"pcregister_{i}")
|
||||
pc_button_view.add_item(pc_register_button)
|
||||
|
||||
await self.get_channel(dislocker.server_config["bot"]["config_public_channel_id"]).send(f'# :index_pointing_at_the_viewer: 使いたいPCの番号を選んでください!', view=pc_button_view)
|
||||
|
||||
elif msg_split[0] == "/stopbutton":
|
||||
stop_button_view = 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 self.get_channel(dislocker.server_config["bot"]["config_public_channel_id"]).send(f'# :index_pointing_at_the_viewer: 使用を停止しますか?', view=stop_button_view)
|
||||
|
||||
elif msg_split[0] == "/userbutton":
|
||||
user_register_button_view = 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 self.get_channel(dislocker.server_config["bot"]["config_public_channel_id"]).send(f'# :index_pointing_at_the_viewer: ユーザー登録はお済ですか?', view=user_register_button_view)
|
||||
|
||||
|
||||
|
||||
elif message.channel.id == dislocker.server_config["bot"]["config_public_channel_id"]:
|
||||
msg_split = message.content.split()
|
||||
if msg_split[0] == "/register":
|
||||
print(len(msg_split))
|
||||
if len(msg_split) == 1:
|
||||
register = self.user_register(name=message.author.display_name, discord_user_name=message.author.name, discord_user_id=message.author.id)
|
||||
print(register)
|
||||
if register["result"] == "ok":
|
||||
await message.channel.send(f"# :white_check_mark: ユーザー情報が登録されました。\nユーザー名:{message.author.display_name}")
|
||||
elif register["result"] == "already_exists":
|
||||
await message.channel.send("# :skull_crossbones: 登録できませんでした。\nそのDiscordアカウントはすでに登録されています。")
|
||||
else:
|
||||
await message.channel.send("# :skull_crossbones: 登録できませんでした。\n内部エラーが発生しています。")
|
||||
else:
|
||||
await message.channel.send("# :skull_crossbones: 登録できませんでした。\n\n-# もしかして...\n-# 手動でメンバーを登録したいですか?\n-# もしそうなら、このチャンネルにはその権限がありません。\n-# そのチャンネルに移動してから、もう一度試してみてください!")
|
||||
|
||||
async def on_button(self, interaction: Interaction):
|
||||
custom_id = interaction.data["custom_id"]
|
||||
custom_id_split = custom_id.split("_")
|
||||
print(custom_id, custom_id_split[0])
|
||||
|
||||
if custom_id_split[0] == "pcregister":
|
||||
device_register_view = View(timeout=15)
|
||||
pc_number = custom_id_split[1]
|
||||
print(custom_id_split)
|
||||
for i in range(1, 11):
|
||||
device_register_button = discord.ui.Button(style=discord.ButtonStyle.primary, label=f"{i}", custom_id=f"deviceregister_{str(pc_number)}_{i}")
|
||||
device_register_view.add_item(device_register_button)
|
||||
|
||||
await interaction.response.send_message(f"# :keyboard: デバイス番号を選んでください!\n>>> # PC番号 | {str(pc_number)}", view=device_register_view, ephemeral=True)
|
||||
|
||||
elif custom_id_split[0] == "deviceregister":
|
||||
pc_number = custom_id_split[1]
|
||||
device_number = custom_id_split[2]
|
||||
reason_register_view = View(timeout=15)
|
||||
reason_button = discord.ui.Button(style=discord.ButtonStyle.primary, label="使用目的を入力する", custom_id=f"reasonregister_{str(pc_number)}_{str(device_number)}")
|
||||
reason_register_view.add_item(reason_button)
|
||||
|
||||
await interaction.response.send_message(f"# :regional_indicator_q: 使用目的を書いてください!\n>>> # PC番号 | {str(pc_number)}\n# デバイス番号 | {str(device_number)}", view=reason_register_view, ephemeral=True)
|
||||
|
||||
elif custom_id_split[0] == "reasonregister":
|
||||
pc_number = custom_id_split[1]
|
||||
device_number = custom_id_split[2]
|
||||
reason_input_form = Reason(title="Dislocker | 登録", pc_number=str(pc_number), device_number=str(device_number))
|
||||
await interaction.response.send_modal(reason_input_form)
|
||||
|
||||
elif custom_id_split[0] == "stop":
|
||||
print("STOP running")
|
||||
pc_stop = self.stop(user_id=interaction.user.id)
|
||||
print(pc_stop)
|
||||
stop_view = View(timeout=15)
|
||||
if pc_stop["result"] == "unused":
|
||||
await interaction.response.send_message("# :shaking_face: 使用されていないようです...", ephemeral=True)
|
||||
elif pc_stop["result"] == "ok":
|
||||
await interaction.response.send_message(f":white_check_mark: PC番号 {pc_stop["pc_number"]} の使用が終了されました。", ephemeral=True)
|
||||
await self.get_channel(dislocker.server_config["bot"]["log_channel_id"]).send(f':negative_squared_cross_mark: {pc_stop["name"]} さんがPC {pc_stop["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":
|
||||
print("User Register RUnning")
|
||||
user_register = self.user_register(name=interaction.user.display_name, discord_user_name=interaction.user.name, discord_user_id=interaction.user.id)
|
||||
if user_register["result"] == "ok":
|
||||
await interaction.response.send_message(f"# :white_check_mark: ユーザー情報が登録されました。\n>>> ユーザー名:{interaction.user.display_name}", ephemeral=True)
|
||||
elif user_register["result"] == "already_exists":
|
||||
await interaction.response.send_message("# :no_entry: 登録できませんでした。\nもう登録されている可能性があります。", ephemeral=True)
|
||||
else:
|
||||
await interaction.response.send_message("# :no_entry: 登録できませんでした。\n内部エラーが発生しています。", ephemeral=True)
|
||||
|
||||
class Monitor():
|
||||
def __init__(self) -> None:
|
||||
pass
|
||||
|
||||
def start(self, **kwargs):
|
||||
self.serach_time = kwargs["search_time"]
|
||||
self.allowable_time = kwargs["allowable_time"]
|
||||
serach_thread = threading.Thread(target=self.search)
|
||||
serach_thread.start()
|
||||
|
||||
|
||||
|
||||
def search(self):
|
||||
try:
|
||||
while True:
|
||||
cursor = dislocker.db.cursor()
|
||||
cursor.execute("SELECT * FROM pc_list WHERE password_hash IS NOT NULL")
|
||||
pc_list = cursor.fetchall()
|
||||
print(pc_list)
|
||||
print(len(pc_list))
|
||||
if pc_list:
|
||||
if len(pc_list) == 1:
|
||||
user_id = pc_list[0][1]
|
||||
cursor.execute("SELECT * FROM pc_usage_history WHERE member_id= %s AND end_use_time IS NULL ORDER BY id DESC LIMIT 1", (user_id,))
|
||||
pc_usage = cursor.fetchall()
|
||||
print(pc_usage)
|
||||
start_time = pc_usage[0][4]
|
||||
print(start_time)
|
||||
print(type(start_time))
|
||||
current_time = datetime.now()
|
||||
time_difference = current_time - start_time
|
||||
print(current_time, start_time)
|
||||
print(time_difference.seconds, timedelta(seconds=self.allowable_time).seconds)
|
||||
if time_difference.seconds >= timedelta(seconds=self.allowable_time).seconds:
|
||||
cursor.execute("SELECT * FROM club_member WHERE id = %s", (user_id,))
|
||||
user_info = cursor.fetchall()
|
||||
stop = bot.stop(user_id=user_info[0][3])
|
||||
|
||||
bot.timeout_notify(pc_number=pc_list[0][0], discord_display_name=user_info[0][1])
|
||||
time.sleep(1)
|
||||
else:
|
||||
result = {"result": "BUT SAFE"}
|
||||
|
||||
|
||||
elif len(pc_list) >= 2:
|
||||
for i in pc_list:
|
||||
print(i)
|
||||
user_id = i[1]
|
||||
cursor.execute("SELECT * FROM pc_usage_history WHERE member_id= %s AND end_use_time IS NULL ORDER BY id DESC LIMIT 1", (user_id,))
|
||||
pc_usage = cursor.fetchall()
|
||||
print(pc_usage)
|
||||
start_time = pc_usage[0][4]
|
||||
print(start_time)
|
||||
print(type(start_time))
|
||||
current_time = datetime.now()
|
||||
time_difference = current_time - start_time
|
||||
print(time_difference.seconds, timedelta(seconds=self.allowable_time).seconds)
|
||||
if time_difference.seconds >= timedelta(seconds=self.allowable_time).seconds:
|
||||
cursor.execute("SELECT * FROM club_member WHERE id = %s", (user_id,))
|
||||
user_info = cursor.fetchall()
|
||||
stop = bot.stop(user_id=user_info[0][3])
|
||||
|
||||
bot.timeout_notify(pc_number=i[0], discord_display_name=user_info[0][1])
|
||||
time.sleep(0.1)
|
||||
else:
|
||||
result = {"result": "BUT SAFE"}
|
||||
|
||||
else:
|
||||
result = {"result": "NONE"}
|
||||
else:
|
||||
result = {"result": "NONE"}
|
||||
|
||||
cursor.close()
|
||||
|
||||
print(result["result"])
|
||||
time.sleep(self.serach_time)
|
||||
|
||||
except Exception as error:
|
||||
print("自動停止処理中にエラーが発生しました。\nエラー内容")
|
||||
print(str(error.__class__.__name__))
|
||||
print(str(error.args))
|
||||
print(str(error))
|
||||
result = {"result": "error"}
|
||||
dislocker.db.rollback()
|
||||
|
||||
finally:
|
||||
cursor.close()
|
||||
print(result["result"])
|
||||
return result
|
||||
|
||||
|
||||
|
||||
class Reason(Modal):
|
||||
def __init__(self, title: str, pc_number: str, device_number: str, timeout=15) -> None:
|
||||
super().__init__(title=title, timeout=timeout)
|
||||
print(pc_number)
|
||||
print(device_number)
|
||||
self.reason_input_form = TextInput(label="使用目的を入力してください", style=TextStyle.short, custom_id=f"register_{pc_number}_{device_number}")
|
||||
self.add_item(self.reason_input_form)
|
||||
|
||||
async def on_submit(self, interaction: Interaction) -> None:
|
||||
custom_id = interaction.data["components"][0]["components"][0]["custom_id"]
|
||||
print(custom_id)
|
||||
custom_id_split = custom_id.split("_")
|
||||
pc_number = custom_id_split[1]
|
||||
device_number = custom_id_split[2]
|
||||
register = bot.register(user_id=interaction.user.id, name=interaction.user.name, display_name=interaction.user.display_name, pc_number=pc_number, device_number=device_number, detail=self.reason_input_form.value)
|
||||
print(register["result"])
|
||||
|
||||
if register["result"] == "ok":
|
||||
await interaction.response.send_message(f":white_check_mark: 使用が開始されました。\n>>> # パスワード | {register["password"]}\n## PC番号 | {pc_number}\n## デバイス番号 | {device_number}\n## 使用目的 | {self.reason_input_form.value}", ephemeral=True)
|
||||
await bot.get_channel(dislocker.server_config["bot"]["log_channel_id"]).send(f':white_check_mark: {register["name"]} さんがPC {pc_number} の使用を開始しました。')
|
||||
elif register["result"] == "pc_already_in_use_by_you":
|
||||
await interaction.response.send_message(f"# :exploding_head: あなたはPCをもう使用されているようです。\n使用状態を解除するには 終了ボタン で使用終了をお知らせください。\n>>> # PC番号 | {register["pc_number"]}\n# デバイス番号 | {register["device_number"]}\n# 使用開始時刻 | {register["start_time"]}\n# 使用目的 | {register["detail"]}", ephemeral=True)
|
||||
elif register["result"] == "pc_already_in_use_by_other":
|
||||
await interaction.response.send_message(f"# :man_gesturing_no: そのPCは他のメンバーによって使用されています。\n別のPC番号を指定して、再度お試しください。", ephemeral=True)
|
||||
elif register["result"] == "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)
|
||||
|
||||
await message.channel.send("引数が多すぎます。")
|
||||
|
||||
|
||||
dislocker = DL()
|
||||
if dislocker.init_result == "ok":
|
||||
print("Botを起動します...")
|
||||
intents = discord.Intents.default()
|
||||
intents.message_content = True
|
||||
bot = Bot(intents=intents)
|
||||
monitor = Monitor()
|
||||
monitor.start(search_time=10, allowable_time=300)
|
||||
bot.run(dislocker.server_config['bot']['token'])
|
||||
else:
|
||||
pass
|
|
@ -4,37 +4,29 @@ import json
|
|||
from flask import Flask, request, jsonify, render_template
|
||||
|
||||
config_dir_path = "./config/"
|
||||
server_config_path = config_dir_path + "server.json"
|
||||
if not os.path.isfile(server_config_path):
|
||||
db_config_path = config_dir_path + "db.json"
|
||||
if not os.path.isfile(db_config_path):
|
||||
if not os.path.isdir(config_dir_path):
|
||||
os.mkdir(config_dir_path)
|
||||
|
||||
server_config = {
|
||||
"db": {
|
||||
db_config = {
|
||||
"host": "localhost",
|
||||
"port": "5432",
|
||||
"db_name": "dislocker",
|
||||
"db": "dislocker",
|
||||
"username": "user",
|
||||
"password": "password"
|
||||
},
|
||||
"bot": {
|
||||
"token": "TYPE HERE BOTS TOKEN KEY",
|
||||
"log_channel_id" : "TYPE HERE CHANNEL ID (YOU MUST USE INT !!!!)",
|
||||
"config_channel_id": "TYPE HERE CHANNEL ID (YOU MUST USE INT !!!!)"
|
||||
"password": "example_pass",
|
||||
"port": "5432"
|
||||
}
|
||||
}
|
||||
with open(server_config_path, "w") as w:
|
||||
json.dump(server_config, w, indent=4)
|
||||
elif os.path.isfile(server_config_path):
|
||||
with open(server_config_path, "r") as r:
|
||||
server_config = json.load(r)
|
||||
with open(db_config_path, "w") as w:
|
||||
json.dump(db_config, w, indent=4)
|
||||
elif os.path.isfile(db_config_path):
|
||||
with open(db_config_path, "r") as r:
|
||||
db_config = json.load(r)
|
||||
|
||||
class Auth():
|
||||
def __init__(self, host, db, port, user, password):
|
||||
self.db = psycopg2.connect(f"host={host} dbname={db} port={port} user={user} password={password}")
|
||||
|
||||
def check(self, pc_number, password):
|
||||
try:
|
||||
cursor = self.db.cursor()
|
||||
cursor.execute("SELECT * FROM pc_list WHERE pc_number = %s AND password_hash = %s", (pc_number, password))
|
||||
pc_info = cursor.fetchall()
|
||||
|
@ -42,77 +34,26 @@ class Auth():
|
|||
return 1
|
||||
else:
|
||||
return 0
|
||||
finally:
|
||||
cursor.close()
|
||||
|
||||
def delete(self, pc_number):
|
||||
try:
|
||||
cursor = self.db.cursor()
|
||||
cursor.execute("UPDATE pc_list SET password_hash = NULL WHERE pc_number = %s", (pc_number,))
|
||||
self.db.commit()
|
||||
finally:
|
||||
cursor.close()
|
||||
|
||||
def stop(self, **kwargs):
|
||||
try:
|
||||
pc_number = int(kwargs["pc_number"])
|
||||
cursor = self.db.cursor()
|
||||
cursor.execute("SELECT * FROM pc_list WHERE pc_number = %s", (pc_number,))
|
||||
pc_list_record = cursor.fetchall()
|
||||
if not pc_list_record[0][1] == None:
|
||||
cursor.execute("UPDATE pc_list SET using_user_id = NULL WHERE pc_number = %s", (pc_number,))
|
||||
|
||||
if not pc_list_record[0][2] == None:
|
||||
cursor.execute("UPDATE pc_list SET password_hash = NULL WHERE pc_number = %s", (pc_number,))
|
||||
|
||||
cursor.execute("SELECT * FROM pc_usage_history WHERE member_id = %s AND pc_number = %s ORDER BY id DESC LIMIT 1", (pc_list_record[0][1], pc_number))
|
||||
pc_usage_history_record = cursor.fetchall()
|
||||
cursor.execute("UPDATE pc_usage_history SET end_use_time = current_timestamp WHERE id = %s", (pc_usage_history_record[0][0],))
|
||||
self.db.commit()
|
||||
result = {"result": "ok"}
|
||||
|
||||
else:
|
||||
result = {"result": "not_used"}
|
||||
|
||||
except:
|
||||
result = {"result": "error"}
|
||||
|
||||
finally:
|
||||
cursor.close()
|
||||
return result
|
||||
|
||||
|
||||
|
||||
app = Flask(__name__, static_folder="./resource/")
|
||||
auth = Auth(server_config["db"]["host"], server_config["db"]["db_name"], server_config["db"]["port"], server_config["db"]["username"], server_config["db"]["password"])
|
||||
auth = Auth(db_config["host"], db_config["db"], db_config["port"], db_config["username"], db_config["password"])
|
||||
|
||||
@app.route('/verify', methods=['POST'])
|
||||
def verify():
|
||||
pc_number = int(request.json.get('pc_number'))
|
||||
password = request.json.get('password')
|
||||
print(str(pc_number) + "の認証処理を開始...")
|
||||
|
||||
if auth.check(pc_number, password) == 0:
|
||||
auth.delete(pc_number)
|
||||
print(str(pc_number) + "の認証処理は成功しました.")
|
||||
return jsonify({'message': 'ok'}), 200
|
||||
else:
|
||||
print(str(pc_number) + "の認証処理は失敗しました.")
|
||||
return jsonify({'message': 'damedesu'}), 401
|
||||
|
||||
@app.route('/stop', methods=['POST'])
|
||||
def stop():
|
||||
pc_number = int(request.json.get('pc_number'))
|
||||
print(str(pc_number) + "の使用停止処理を開始...")
|
||||
pc_stop = auth.stop(pc_number=pc_number)
|
||||
if pc_stop["result"] == "ok":
|
||||
print(str(pc_number) + "の使用停止処理は成功しました.")
|
||||
return jsonify({'message': 'ok'}), 200
|
||||
else:
|
||||
print(str(pc_number) + "の使用停止処理は失敗しました.")
|
||||
return jsonify({'message': 'error'}), 500
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host="0.0.0.0", port=5000, debug=True)
|
|
@ -11,44 +11,6 @@ import string
|
|||
import random
|
||||
import tkinter
|
||||
import threading
|
||||
import signal
|
||||
import sys
|
||||
|
||||
app_name = "Dislocker"
|
||||
dislocker_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
|
||||
|
||||
os.chdir(dislocker_dir)
|
||||
|
||||
config_dir_path = "./config/"
|
||||
client_config_path = config_dir_path + "client.json"
|
||||
if not os.path.isfile(client_config_path):
|
||||
if not os.path.isdir(config_dir_path):
|
||||
os.mkdir(config_dir_path)
|
||||
|
||||
client_config = {
|
||||
"initial": 1,
|
||||
"auth_host_url": "http://localhost",
|
||||
"pc_number": 1,
|
||||
"master_password_hash": "",
|
||||
"testing": 0
|
||||
}
|
||||
|
||||
elif os.path.isfile(client_config_path):
|
||||
with open(client_config_path, "r") as r:
|
||||
client_config = json.load(r)
|
||||
|
||||
def init(**kwargs):
|
||||
master_password = master_password_gen()
|
||||
msgbox = tkinter.messagebox.showinfo(title=f"{app_name} | 初回起動を検出", message=f"初回起動のようです。\nマスターパスワードを記録しておいてください。\nこれ以降二度と表示されることはないでしょう。\n\n{master_password["password"]}\n\nまた、認証先サーバーの接続先を指定してください。ロックを解除できなくなります。")
|
||||
client_config["master_password_hash"] = master_password["password_hash"]
|
||||
client_config["initial"] = 0
|
||||
if "pc_number" in kwargs:
|
||||
client_config["pc_number"] = int(kwargs["pc_number"])
|
||||
else:
|
||||
client_config["pc_number"] = 1
|
||||
with open(client_config_path, "w") as w:
|
||||
json.dump(client_config, w, indent=4)
|
||||
|
||||
|
||||
class App(customtkinter.CTk):
|
||||
def __init__(self):
|
||||
|
@ -78,7 +40,7 @@ class App(customtkinter.CTk):
|
|||
keyboard.block_key(i)
|
||||
|
||||
def block_taskmgr(self):
|
||||
block = subprocess.run(['reg', 'add', 'HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System', '/v', 'DisableTaskMgr', '/t', 'REG_DWORD', '/d', '1', '/f'])
|
||||
block = subprocess.run(['reg', 'add', 'HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System', '/v', 'DisableTaskMgr', '/t', 'REG_DWORD', '/d', '1'])
|
||||
print(block)
|
||||
|
||||
def unlock_taskmgr(self):
|
||||
|
@ -107,14 +69,7 @@ class Lock(customtkinter.CTkToplevel):
|
|||
self.title(f'{app_name} | PC番号 {client_config["pc_number"]} | テストモード')
|
||||
else:
|
||||
self.title(f'{app_name} | PC番号 {client_config["pc_number"]} | ロックされています')
|
||||
|
||||
self.window_width = 600
|
||||
self.window_height = 320
|
||||
self.screen_width = self.winfo_screenwidth()
|
||||
self.screen_height = self.winfo_screenheight()
|
||||
self.center_x = int(self.screen_width/2 - self.window_width/2)
|
||||
self.center_y = int(self.screen_height/2 - self.window_height/2)
|
||||
self.geometry(f"{str(self.window_width)}x{str(self.window_height)}+{str(self.center_x)}+{str(self.center_y)}")
|
||||
self.geometry("600x400")
|
||||
self.resizable(height=False, width=False)
|
||||
self.attributes('-topmost', True)
|
||||
self.grab_set()
|
||||
|
@ -123,21 +78,19 @@ class Lock(customtkinter.CTkToplevel):
|
|||
|
||||
self.emoji_font = customtkinter.CTkFont(family="Segoe UI Emoji", size=32)
|
||||
self.title_font = customtkinter.CTkFont(family="meiryo", size=32, weight="bold")
|
||||
self.pc_number_font = customtkinter.CTkFont(family="meiryo", size=64, weight="bold")
|
||||
self.title_small_font = customtkinter.CTkFont(family="meiryo", size=16)
|
||||
self.general_font = customtkinter.CTkFont(family="meiryo", size=18)
|
||||
self.general_small_font = customtkinter.CTkFont(family="meiryo", size=12)
|
||||
self.textbox_font = customtkinter.CTkFont(family="meiryo", size=14)
|
||||
self.button_font = customtkinter.CTkFont(family="meiryo", size=14)
|
||||
|
||||
|
||||
self.msg_title_frame = customtkinter.CTkFrame(self, corner_radius=0, fg_color='transparent')
|
||||
self.msg_title_frame.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")
|
||||
|
||||
self.icon_title_1 = customtkinter.CTkLabel(self.msg_title_frame, text='😎', font=self.emoji_font, justify="left")
|
||||
self.icon_title_1.grid(row=0, column=0, padx=10, sticky="w")
|
||||
|
||||
self.msg_title_1 = customtkinter.CTkLabel(self.msg_title_frame, text=f'ちょっと待って!! PC番号 | {client_config["pc_number"]}', font=self.title_font, justify="left")
|
||||
self.msg_title_1 = customtkinter.CTkLabel(self.msg_title_frame, text='ちょっと待って!!', font=self.title_font, justify="left")
|
||||
self.msg_title_1.grid(row=0, column=1, padx=10, sticky="w")
|
||||
|
||||
self.msg_title_2 = customtkinter.CTkLabel(self.msg_title_frame, text="本当にあなたですか?", font=self.title_small_font, justify="left")
|
||||
|
@ -159,7 +112,6 @@ class Lock(customtkinter.CTkToplevel):
|
|||
|
||||
self.password_entry = customtkinter.CTkEntry(self.input_frame, placeholder_text='パスワード', show='*', font=self.textbox_font)
|
||||
self.password_entry.grid(row=0, column=0, padx=10, sticky="ew")
|
||||
self.password_entry.bind("<Return>", self.auth_start_ev)
|
||||
|
||||
self.button_frame = customtkinter.CTkFrame(self, corner_radius=0, fg_color='transparent')
|
||||
self.button_frame.grid(row=3, column=0, padx=10, pady=10, sticky="nsew")
|
||||
|
@ -167,13 +119,13 @@ class Lock(customtkinter.CTkToplevel):
|
|||
self.button_frame.columnconfigure(1, weight=1)
|
||||
self.button_frame.columnconfigure(2, weight=1)
|
||||
|
||||
self.signin_button = customtkinter.CTkButton(self.button_frame, text='サインイン', command=self.auth_start, font=self.button_font)
|
||||
self.signin_button = customtkinter.CTkButton(self.button_frame, text='サインイン', command=self.auth, font=self.button_font)
|
||||
self.signin_button.grid(row=0, column=2, padx=10, sticky="e")
|
||||
|
||||
self.logout_button = customtkinter.CTkButton(self.button_frame, text='サインアウト', command=self.logout, font=self.button_font)
|
||||
self.logout_button.grid(row=0, column=1, padx=10, sticky="e")
|
||||
|
||||
self.signin_button = customtkinter.CTkButton(self.button_frame, text='ヘルプ', command=self.help_dummy, font=self.button_font)
|
||||
self.signin_button = customtkinter.CTkButton(self.button_frame, text='ヘルプ', command=self.help_wakeup, font=self.button_font)
|
||||
self.signin_button.grid(row=0, column=0, padx=10, sticky="w")
|
||||
|
||||
self.keyboard_listener_thread = threading.Thread(target=self.keyboard_listener)
|
||||
|
@ -190,29 +142,7 @@ class Lock(customtkinter.CTkToplevel):
|
|||
hashed = hashlib.md5(source.encode())
|
||||
return hashed.hexdigest()
|
||||
|
||||
def auth_start(self):
|
||||
auth_thread = threading.Thread(target=self.auth)
|
||||
auth_thread.daemon = True
|
||||
auth_thread.start()
|
||||
|
||||
def auth_start_ev(self, event):
|
||||
auth_thread = threading.Thread(target=self.auth)
|
||||
auth_thread.daemon = True
|
||||
auth_thread.start()
|
||||
|
||||
|
||||
def auth(self):
|
||||
password = str(self.password_entry.get())
|
||||
if len(password) == 10:
|
||||
print("マスターパスワードで認証を試行します。")
|
||||
master_password_hash = self.hash_genarate(str(self.password_entry.get()))
|
||||
if client_config["master_password_hash"] == master_password_hash:
|
||||
print("マスターパスワードで認証しました。")
|
||||
self.exit()
|
||||
else:
|
||||
print("マスターパスワードで認証できませんでした。")
|
||||
|
||||
|
||||
print("認証サーバーにアクセスします。")
|
||||
auth_url = client_config["auth_host_url"] + "/verify"
|
||||
auth_json = {
|
||||
|
@ -224,13 +154,6 @@ class Lock(customtkinter.CTkToplevel):
|
|||
if responce.status_code == 200:
|
||||
print("認証サーバー経由で認証しました。")
|
||||
self.exit()
|
||||
else:
|
||||
print("認証サーバー経由での認証に失敗しました。")
|
||||
self.withdraw()
|
||||
msgbox = tkinter.messagebox.showinfo(title=f"{app_name} | 誤ったパスワード", message=f"パスワードが間違っています!")
|
||||
self.msg_subtitle_1.configure(text='パスワードが間違っています! ')
|
||||
self.deiconify()
|
||||
|
||||
|
||||
except:
|
||||
print("認証サーバーにアクセスできません。マスターパスワードで認証を試行します。")
|
||||
|
@ -240,13 +163,9 @@ class Lock(customtkinter.CTkToplevel):
|
|||
self.exit()
|
||||
else:
|
||||
print("マスターパスワードで認証できませんでした。")
|
||||
self.withdraw()
|
||||
msgbox = tkinter.messagebox.showinfo(title=f"{app_name} | ネットワークエラー", message=f"認証サーバーにアクセスできませんでした。\n続行するには、マスターパスワードを入力してください。")
|
||||
self.msg_subtitle_1.configure(text='ネットワークエラーが発生しています。\n続行するには、マスターパスワードを入力して下さい。 ')
|
||||
self.deiconify()
|
||||
|
||||
def logout(self):
|
||||
app.unlock_taskmgr()
|
||||
self.destroy()
|
||||
logout_command = subprocess.run(['shutdown', '/l', '/f'])
|
||||
print(logout_command)
|
||||
|
@ -255,11 +174,6 @@ class Lock(customtkinter.CTkToplevel):
|
|||
def handler_close(self):
|
||||
pass
|
||||
|
||||
def help_dummy(self):
|
||||
self.withdraw()
|
||||
msgbox = tkinter.messagebox.showinfo(title=f"{app_name} | 未実装", message=f"ヘルプページは製作途中です。\nDiscordサーバーの指示に従って、認証を進めてください。")
|
||||
self.deiconify()
|
||||
|
||||
def exit(self):
|
||||
self.destroy()
|
||||
app.exit()
|
||||
|
@ -272,52 +186,17 @@ class Help(customtkinter.CTkToplevel):
|
|||
self.title(f'{app_name} | ヘルプ | テストモード')
|
||||
else:
|
||||
self.title(f'{app_name} | ヘルプ')
|
||||
self.iconbitmap("./resource/icon/dislocker.ico")
|
||||
self.geometry("600x400")
|
||||
self.resizable(height=False, width=False)
|
||||
self.attributes('-topmost', True)
|
||||
self.grab_set()
|
||||
self.lift()
|
||||
self.protocol("WM_DELETE_WINDOW", self.handler_close)
|
||||
msgbox = tkinter.messagebox.showinfo(title=f"{app_name} | 未実装", message=f"ヘルプページは製作途中です。\nDiscordサーバーの指示に従って、認証を進めてください。")
|
||||
self.destroy()
|
||||
|
||||
def handler_close(self):
|
||||
self.destroy()
|
||||
|
||||
class Monitor():
|
||||
def __init__(self) -> None:
|
||||
pass
|
||||
|
||||
def start(self):
|
||||
monitor_thread = threading.Thread(target=self.run)
|
||||
monitor_thread.start()
|
||||
|
||||
def signal_handler(self):
|
||||
print("停止処理を実行。")
|
||||
stop_url = client_config["auth_host_url"] + "/stop"
|
||||
stop_json = {
|
||||
"pc_number": int(client_config["pc_number"])
|
||||
}
|
||||
try:
|
||||
responce = requests.post(stop_url, json=stop_json)
|
||||
if responce.status_code == 200:
|
||||
print("停止処理は成功しました。")
|
||||
else:
|
||||
print("内部エラーにより停止処理に失敗しました。")
|
||||
result_msgbox = tkinter.messagebox.showwarning(title=f"{app_name} | エラー", message=f"内部エラーにより停止処理に失敗しました。\nDiscordサーバーの指示に従って、停止処理を自身で行ってください。")
|
||||
except:
|
||||
print("ネットワークエラーにより停止処理に失敗しました。")
|
||||
result_msgbox = tkinter.messagebox.showwarning(title=f"{app_name} | エラー", message=f"ネットワークエラーにより停止処理に失敗しました。\nDiscordサーバーの指示に従って、停止処理を自身で行ってください。")
|
||||
finally:
|
||||
self.shutdown()
|
||||
|
||||
def shutdown(self):
|
||||
logout_command = subprocess.run(['shutdown', '/s', '/t', '1'])
|
||||
|
||||
|
||||
def run(self):
|
||||
signal.signal(signal.SIGTERM, self.signal_handler)
|
||||
|
||||
|
||||
def master_password_gen():
|
||||
|
@ -327,21 +206,39 @@ def master_password_gen():
|
|||
result = {"password": password, "password_hash": password_hash}
|
||||
return result
|
||||
|
||||
app_name = "Dislocker"
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = sys.argv
|
||||
if len(args) >= 2:
|
||||
if args[1] == "stop":
|
||||
monitor = Monitor()
|
||||
monitor.signal_handler()
|
||||
elif args[1] == "setup":
|
||||
init(pc_number=args[2])
|
||||
else:
|
||||
print("引数エラー。")
|
||||
else:
|
||||
if client_config["initial"] == 1:
|
||||
init()
|
||||
else:
|
||||
config_dir_path = "./config/"
|
||||
client_config_path = config_dir_path + "client.json"
|
||||
if not os.path.isfile(client_config_path):
|
||||
if not os.path.isdir(config_dir_path):
|
||||
os.mkdir(config_dir_path)
|
||||
|
||||
client_config = {
|
||||
"initial": 1,
|
||||
"auth_host_url": "http://localhost",
|
||||
"pc_number": 1,
|
||||
"master_password_hash": "",
|
||||
"testing": 0
|
||||
|
||||
}
|
||||
with open(client_config_path, "w") as w:
|
||||
json.dump(client_config, w, indent=4)
|
||||
elif os.path.isfile(client_config_path):
|
||||
with open(client_config_path, "r") as r:
|
||||
client_config = json.load(r)
|
||||
|
||||
|
||||
if client_config["initial"] == 1:
|
||||
master_password = master_password_gen()
|
||||
msgbox = tkinter.messagebox.showinfo(title=f"{app_name} | 初回起動を検出", message=f"初回起動のようです。\nマスターパスワードを記録しておいてください。\nこれ以降二度と表示されることはないでしょう。\n\n{master_password["password"]}\n\nまた、認証先サーバーの接続先を指定してください。ロックを解除できなくなります。")
|
||||
client_config["master_password_hash"] = master_password["password_hash"]
|
||||
client_config["initial"] = 0
|
||||
with open(client_config_path, "w") as w:
|
||||
json.dump(client_config, w, indent=4)
|
||||
|
||||
else:
|
||||
if __name__ == '__main__':
|
||||
app = App()
|
||||
app.protocol("WM_DELETE_WINDOW", app.handler_close)
|
||||
app.mainloop()
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
pyinstaller .\dislocker_client.py --noconsole --icon .\dislocker.ico --add-data ".\resource:resource"
|
|
@ -5,7 +5,4 @@ CREATE TABLE club_member (id SERIAL NOT NULL, name VARCHAR(30) NOT NULL, discord
|
|||
CREATE TABLE pc_list (pc_number INTEGER NOT NULL, using_user_id INTEGER, password_hash VARCHAR(32), PRIMARY KEY (pc_number), FOREIGN KEY (using_user_id) REFERENCES club_member(id));
|
||||
CREATE TABLE pc_usage_history (id SERIAL NOT NULL, member_id INTEGER NOT NULL, pc_number INTEGER NOT NULL, device_number INTEGER NOT NULL, start_use_time TIMESTAMP NOT NULL, end_use_time TIMESTAMP, use_detail VARCHAR(30), PRIMARY KEY (id), FOREIGN KEY (member_id) REFERENCES club_member(id), FOREIGN KEY (pc_number) REFERENCES pc_list(pc_number));
|
||||
|
||||
# PC登録
|
||||
INSERT INTO pc_list (pc_number) VALUES (PC番号をいれる);
|
||||
|
||||
INSERTのとき文字列はシングルクォーテーションで囲む!!!
|
|
@ -1,4 +0,0 @@
|
|||
customtkinter
|
||||
winotify
|
||||
keyboard
|
||||
requests
|
Before Width: | Height: | Size: 352 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 695 B |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 101 KiB |
Before Width: | Height: | Size: 3.6 KiB |
|
@ -1,21 +0,0 @@
|
|||
@echo off
|
||||
set dir=%~dp0
|
||||
cd %dir%
|
||||
schtasks /create /tn "Dislocker_Client" /tr "%dir%dislocker_client.exe" /sc onlogon /ru "%USERNAME%" /rl highest /f
|
||||
if %ERRORLEVEL% == 0 (
|
||||
echo タスクスケジューラーの設定は完了しました。
|
||||
)
|
||||
if %ERRORLEVEL% == 1 (
|
||||
echo タスクスケジューラーの設定でエラーが発生しました。
|
||||
)
|
||||
Cscript "%dir%shortcut.vbs" "%dir%" "%dir%" "dislocker_client.exe" "stop" "シャットダウンと停止処理"
|
||||
if %ERRORLEVEL% == 0 (
|
||||
Cscript "%dir%shortcut.vbs" "%USERPROFILE%/Desktop" "%dir%" "dislocker_client.exe" "stop" "シャットダウンと停止処理"
|
||||
echo ショートカットの作成は完了しました。
|
||||
)
|
||||
if %ERRORLEVEL% == 1 (
|
||||
echo ショートカットの作成でエラーが発生しました。
|
||||
)
|
||||
set /P pc_number=PC番号を入力
|
||||
start %dir%dislocker_client.exe setup %pc_number%
|
||||
pause
|
|
@ -1,8 +0,0 @@
|
|||
Set WshShell = CreateObject("WScript.Shell")
|
||||
Set args = Wscript.Arguments
|
||||
Set Shortcut = WshShell.CreateShortcut(args(0) & "\シャットダウンと終了処理.lnk")
|
||||
Shortcut.TargetPath = args(1) & args(2)
|
||||
Shortcut.Arguments = args(3)
|
||||
Shortcut.WorkingDirectory = args(1)
|
||||
Shortcut.Save
|
||||
WScript.Quit(0)
|