Esempio n. 1
0
async def apiAdminRolesCreate(cls: "PhaazebotWeb",
                              WebRequest: ExtendedRequest) -> Response:
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Create: StorageTransformer = StorageTransformer()
    Create["name"] = Data.getStr("name", UNDEFINED, len_max=64)
    Create["description"] = Data.getStr("description", UNDEFINED, len_max=512)
    Create["can_be_removed"] = Data.getBool("name", UNDEFINED)

    # checks
    if Create["name"] == UNDEFINED:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'name'")

    res: list = cls.BASE.PhaazeDB.selectQuery(
        "SELECT COUNT(*) AS `i` FROM `web_role` WHERE LOWER(`web_role`.`name`) = %s",
        (Create["name"], ))

    if res[0]['i'] != 0:
        return await cls.Tree.Api.errors.apiWrongData(
            cls, WebRequest, msg=f"role '{Create['name']}' already exists")

    cls.BASE.PhaazeDB.insertQuery(table="web_role",
                                  content=Create.getAllTransform())

    return cls.response(text=json.dumps(
        dict(msg="role successful created", role=Create["name"], status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 2
0
async def apiAdminUsersCreate(cls:"PhaazebotWeb", WebRequest:ExtendedRequest) -> Response:
	"""
	Default url: /api/admin/users/create
	"""
	Data:WebRequestContent = WebRequestContent(WebRequest)
	await Data.load()

	# get required stuff
	Create:StorageTransformer = StorageTransformer()
	Create["username"] = Data.getStr("username", UNDEFINED, len_max=64)
	Create["email"] = Data.getStr("email", UNDEFINED, len_max=128)
	Create["password"] = Data.getStr("password", UNDEFINED, len_max=256)

	# checks
	if not Create["username"] or not Create["email"] or not Create["password"]:
		return await cls.Tree.Api.errors.apiMissingData(cls, WebRequest, msg="missing 'username', 'email' or 'password'")

	Create["password"] = passwordFunction(Create["password"])

	res_users:List[WebUser] = await getWebUsers(cls, overwrite_where=" AND LOWER(`user`.`username`) = LOWER(%s) OR LOWER(`user`.`email`) = LOWER(%s)", overwrite_where_values=(Create["username"], Create["email"]))

	if res_users:
		return await cls.Tree.Api.Account.errors.apiAccountTaken(cls, WebRequest)

	new_id:int = cls.BASE.PhaazeDB.insertQuery(
		table="user",
		content=Create.getAllTransform()
	)

	cls.BASE.Logger.debug(f"(API/Admin) Created user '{Create['username']}' (ID:{new_id})", require="api:user")
	return cls.response(
		text=json.dumps(dict(msg="successful created user", user_id=new_id, status=200)),
		content_type="application/json",
		status=200
	)
Esempio n. 3
0
async def apiDiscordLogsGet(cls: "PhaazebotWeb",
                            WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/logs/get
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Search: StorageTransformer = StorageTransformer()
    Search["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
    Search["log_id"] = Data.getStr("log_id", UNDEFINED, must_be_digit=True)
    Search["event_value"] = Data.getInt("event_value", UNDEFINED, min_x=1)
    Search["content_contains"] = Data.getStr("content_contains",
                                             "",
                                             len_min=1,
                                             len_max=512)
    Search["date_from"] = Data.getStr("date_from", None, len_min=1, len_max=64)
    Search["date_to"] = Data.getStr("date_to", None, len_min=1, len_max=64)
    Search["created_at_between"] = (Search["date_from"], Search["date_to"])
    Search["limit"] = Data.getInt("limit",
                                  DEFAULT_LIMIT,
                                  min_x=1,
                                  max_x=MAX_LIMIT)
    Search["offset"] = Data.getInt("offset", 0, min_x=0)

    # checks
    if not Search["guild_id"]:
        return await apiMissingData(cls,
                                    WebRequest,
                                    msg="missing or invalid 'guild_id'")

    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Search["guild_id"]))
    if not Guild:
        return await apiDiscordGuildUnknown(cls, WebRequest)

    log_res: List[DiscordLog] = await getDiscordServerLogs(
        PhaazeDiscord, **Search.getAllTransform())

    result: Dict[str,
                 Any] = dict(result=[Log.toJSON() for Log in log_res],
                             total=await
                             getDiscordServerLogs(PhaazeDiscord,
                                                  count_mode=True,
                                                  **Search.getAllTransform()),
                             limit=Search["limit"],
                             offset=Search["offset"],
                             status=200)

    return cls.response(text=json.dumps(result),
                        content_type="application/json",
                        status=200)
Esempio n. 4
0
async def apiDiscordConfigsNsfwEnabledChannelsGet(cls:"PhaazebotWeb", WebRequest:ExtendedRequest) -> Response:
	"""
	Default url: /api/discord/configs/nsfwenabledchannels/get
	"""
	Data:WebRequestContent = WebRequestContent(WebRequest)
	await Data.load()

	# get required stuff
	Search:StorageTransformer = StorageTransformer()
	Search["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
	Search["entry_id"] = Data.getStr("entry_id", UNDEFINED, must_be_digit=True)
	Search["channel_id"] = Data.getStr("channel_id", UNDEFINED, must_be_digit=True)
	Search["limit"] = Data.getInt("limit", DEFAULT_LIMIT, min_x=1, max_x=MAX_LIMIT)
	Search["offset"] = Data.getInt("offset", 0, min_x=0)

	# checks
	if not Search["guild_id"]:
		return await apiMissingData(cls, WebRequest, msg="missing or invalid 'guild_id'")

	PhaazeDiscord:"PhaazebotDiscord" = cls.BASE.Discord
	Guild:discord.Guild = discord.utils.get(PhaazeDiscord.guilds, id=int(Search["guild_id"]))
	if not Guild:
		return await apiDiscordGuildUnknown(cls, WebRequest)

	# get user info
	AuthDiscord:AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
	if not AuthDiscord.found:
		return await cls.Tree.Api.errors.apiMissingAuthorisation(cls, WebRequest)

	# get member
	CheckMember:discord.Member = Guild.get_member(int(AuthDiscord.User.user_id))
	if not CheckMember:
		return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(cls, WebRequest, guild_id=Search["guild_id"], user_id=AuthDiscord.User.user_id)

	# check permissions
	if not (CheckMember.guild_permissions.administrator or CheckMember.guild_permissions.manage_guild):
		return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(cls, WebRequest, guild_id=Search["guild_id"], user_id=AuthDiscord.User.user_id)

	channel_res:List[DiscordNsfwEnabledChannel] = await getDiscordServerNsfwEnabledChannels(PhaazeDiscord, **Search.getAllTransform())

	result:Dict[str, Any] = dict(
		result=[Chan.toJSON() for Chan in channel_res],
		limit=Search["limit"],
		offset=Search["offset"],
		total=await getDiscordServerNsfwEnabledChannels(PhaazeDiscord, count_mode=True, **Search.getAllTransform()),
		status=200
	)

	return cls.response(
		text=json.dumps(result),
		content_type="application/json",
		status=200
	)
Esempio n. 5
0
async def apiDiscordTwitchalertsGet(cls: "PhaazebotWeb",
                                    WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/twitchalerts/get
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Search: StorageTransformer = StorageTransformer()
    Search["discord_guild_id"] = Data.getStr("guild_id",
                                             UNDEFINED,
                                             must_be_digit=True)
    Search["alert_id"] = Data.getInt("alert_id", UNDEFINED, min_x=1)
    Search["limit"] = Data.getInt("limit",
                                  DEFAULT_LIMIT,
                                  min_x=1,
                                  max_x=MAX_LIMIT)
    Search["offset"] = Data.getInt("offset", 0, min_x=0)

    # checks
    if not Search["discord_guild_id"]:
        return await apiMissingData(cls,
                                    WebRequest,
                                    msg="missing or invalid 'guild_id'")

    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(
                                                 Search["discord_guild_id"]))
    if not Guild:
        return await apiDiscordGuildUnknown(cls, WebRequest)

    # get alerts
    res_alerts: List[DiscordTwitchAlert] = await getDiscordServerTwitchAlerts(
        PhaazeDiscord, **Search.getAllTransform())

    # if only one is requested, also send custom content
    with_message: bool = True if Search["alert_id"] else False

    result: Dict[str, Any] = dict(
        result=[Alert.toJSON(custom_msg=with_message) for Alert in res_alerts],
        limit=Search["limit"],
        offset=Search["offset"],
        total=await getDiscordServerTwitchAlerts(PhaazeDiscord,
                                                 count_mode=True,
                                                 **Search.getAllTransform()),
        status=200)

    return cls.response(text=json.dumps(result),
                        content_type="application/json",
                        status=200)
Esempio n. 6
0
async def apiDiscordAssignrolesGet(cls: "PhaazebotWeb",
                                   WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/assignroles/get
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Search: StorageTransformer = StorageTransformer()
    Search["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
    Search["assignrole_id"] = Data.getStr("assignrole_id",
                                          UNDEFINED,
                                          must_be_digit=True)
    Search["role_id"] = Data.getStr("role_id", UNDEFINED, must_be_digit=True)
    Search["limit"] = Data.getInt("limit",
                                  DEFAULT_LIMIT,
                                  min_x=1,
                                  max_x=MAX_LIMIT)
    Search["offset"] = Data.getInt("offset", 0, min_x=0)

    # checks
    if not Search["guild_id"]:
        return await apiMissingData(cls,
                                    WebRequest,
                                    msg="missing or invalid 'guild_id'")

    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Search["guild_id"]))
    if not Guild:
        return await apiDiscordGuildUnknown(cls, WebRequest)

    assignroles: list = await getDiscordServerAssignRoles(
        PhaazeDiscord, **Search.getAllTransform())

    result: Dict[str, Any] = dict(
        result=[ARole.toJSON() for ARole in assignroles],
        limit=Search["limit"],
        offset=Search["offset"],
        total=await getDiscordServerAssignRoles(PhaazeDiscord,
                                                count_mode=True,
                                                **Search.getAllTransform()),
        status=200)

    return cls.response(text=json.dumps(result),
                        content_type="application/json",
                        status=200)
Esempio n. 7
0
async def apiAdminRolesGet(cls: "PhaazebotWeb",
                           WebRequest: Request) -> Response:
    """
	Default url: /api/admin/roles/get
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    Search: StorageTransformer = StorageTransformer()

    # get required stuff
    Search["role_id"] = Data.getInt("role_id", UNDEFINED, min_x=1)
    Search["name"] = Data.getStr("name", UNDEFINED)
    Search["name_contains"] = Data.getStr("name_contains", UNDEFINED)
    Search["can_be_removed"] = Data.getInt("can_be_removed", UNDEFINED)
    Search["limit"] = Data.getInt("limit", DEFAULT_LIMIT, min_x=1)
    Search["offset"] = Data.getInt("offset", 0, min_x=1)

    # custom
    Search["for_user_id"] = Data.getInt("for_user_id", UNDEFINED, min_x=1)
    if Search["for_user_id"] != UNDEFINED:

        res: List[dict] = cls.BASE.PhaazeDB.selectQuery(
            """
			SELECT `web_user+web_role`.`role_id` AS `rid`
			FROM `web_user+web_role`
			WHERE `web_user+web_role`.`user_id` = %s""", (int(Search["for_user_id"]), ))

        rid_list: str = ','.join(str(x["rid"]) for x in res)
        if not rid_list: rid_list = "0"

        Search["overwrite_where"] = f" AND `web_role`.`id` IN ({rid_list})"

    res_roles: List[WebRole] = await getWebRoles(cls,
                                                 **Search.getAllTransform())

    result: dict = dict(result=[Role.toJSON() for Role in res_roles],
                        limit=Search["limit"],
                        offset=Search["offset"],
                        total=await getWebRoles(cls,
                                                count_mode=True,
                                                **Search.getAllTransform()),
                        status=200)

    return cls.response(text=json.dumps(result),
                        content_type="application/json",
                        status=200)
Esempio n. 8
0
async def apiDiscordLevelsMedalsGet(cls:"PhaazebotWeb", WebRequest:ExtendedRequest) -> Response:
	"""
	Default url: /api/discord/levels/medals/get
	"""
	Data:WebRequestContent = WebRequestContent(WebRequest)
	await Data.load()

	# get required stuff
	Search:StorageTransformer = StorageTransformer()
	Search["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
	Search["medal_id"] = Data.getStr("medal_id", UNDEFINED, must_be_digit=True)
	Search["member_id"] = Data.getStr("member_id", UNDEFINED, must_be_digit=True)
	Search["name"] = Data.getStr("name", UNDEFINED, len_max=512)
	Search["name_contains"] = Data.getStr("name_contains", UNDEFINED, len_max=512)
	Search["limit"] = Data.getInt("limit", DEFAULT_LIMIT, min_x=1, max_x=MAX_LIMIT)
	Search["offset"] = Data.getInt("offset", 0, min_x=0)

	if not Search["guild_id"]:
		return await apiMissingData(cls, WebRequest, msg="missing or invalid 'guild_id'")

	PhaazeDiscord:"PhaazebotDiscord" = cls.BASE.Discord
	Guild:discord.Guild = discord.utils.get(PhaazeDiscord.guilds, id=int(Search["guild_id"]))
	if not Guild:
		return await apiDiscordGuildUnknown(cls, WebRequest)

	# get medals
	res_medals:list = await getDiscordUsersMedals(PhaazeDiscord, **Search.getAllTransform())

	result:Dict[str, Any] = dict(
		result=[Medal.toJSON() for Medal in res_medals],
		limit=Search["limit"],
		offset=Search["offset"],
		total=await getDiscordUsersMedals(PhaazeDiscord, count_mode=True, **Search.getAllTransform()),
		status=200
	)

	return cls.response(
		text=json.dumps(result),
		content_type="application/json",
		status=200
	)
Esempio n. 9
0
async def apiAdminUsersGet(cls: "PhaazebotWeb",
                           WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/admin/users/get
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    Search: StorageTransformer = StorageTransformer()

    # get required stuff
    Search["user_id"] = Data.getInt("user_id", UNDEFINED, min_x=1)
    Search["username"] = Data.getStr("username", UNDEFINED, len_max=64)
    Search["username_contains"] = Data.getStr("username_contains",
                                              UNDEFINED,
                                              len_max=64)
    Search["email"] = Data.getStr("email", UNDEFINED, len_max=128)
    Search["email_contains"] = Data.getStr("email_contains",
                                           UNDEFINED,
                                           len_max=128)
    Search["limit"] = Data.getInt("limit", DEFAULT_LIMIT, min_x=1)
    Search["offset"] = Data.getInt("offset", 0, min_x=1)

    # get user
    res_users: List[WebUser] = await getWebUsers(cls,
                                                 **Search.getAllTransform())

    result: Dict[str, Any] = dict(result=[Us.toJSON() for Us in res_users],
                                  limit=Search["limit"],
                                  offset=Search["offset"],
                                  total=await
                                  getWebUsers(cls,
                                              count_mode=True,
                                              **Search.getAllTransform()),
                                  status=200)

    return cls.response(text=json.dumps(result),
                        content_type="application/json",
                        status=200)
Esempio n. 10
0
async def apiDiscordAssignrolesCreate(cls: "PhaazebotWeb",
                                      WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/assignroles/create
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Create: StorageTransformer = StorageTransformer()
    Create["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
    Create["role_id"] = Data.getStr("role_id", UNDEFINED, must_be_digit=True)
    Create["trigger"] = Data.getStr("trigger", "").lower().split(
        " "
    )[0]  # only take the first argument trigger, since everything else can't be typed in a channel

    # checks
    if not Create["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    if not Create["role_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'role_id'")

    if not Create["trigger"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'trigger'")

    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Create["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # get server role
    AssignRole: discord.Role = getDiscordRoleFromString(
        PhaazeDiscord, Guild, Create["role_id"])
    if not AssignRole:
        return await cls.Tree.Api.Discord.errors.apiDiscordRoleNotFound(
            cls,
            WebRequest,
            guild_id=Guild.name,
            guild_name=Guild.name,
            role_id=Create["role_id"])

    if AssignRole >= Guild.me.top_role or AssignRole == Guild.default_role:
        return await cls.Tree.errors.piWrongData(
            cls, WebRequest, msg=f"The Role `{AssignRole.name}` is to high")

    # check if already exists and limits
    res: list = cls.BASE.PhaazeDB.selectQuery(
        """
		SELECT
			COUNT(*) AS `all`,
			SUM(
				CASE WHEN `discord_assignrole`.`role_id` = %s
				THEN 1 ELSE 0 END
			) AS `match_role_id`,
			SUM(
				CASE WHEN LOWER(`discord_assignrole`.`trigger`) = LOWER(%s)
				THEN 1 ELSE 0 END
			) AS `match_trigger`
		FROM `discord_assignrole`
		WHERE `discord_assignrole`.`guild_id` = %s""",
        (Create["role_id"], Create["trigger"], Create["guild_id"]))

    if res[0]["match_role_id"]:
        return await cls.Tree.Api.Discord.errors.apiDiscordAssignRoleExists(
            cls,
            WebRequest,
            role_id=Create["role_id"],
            role_name=AssignRole.name)

    if res[0]["match_trigger"]:
        return await cls.Tree.Api.Discord.errors.apiDiscordAssignRoleExists(
            cls, WebRequest, trigger=Create["trigger"])

    if res[0]["all"] >= cls.BASE.Limit.discord_assignrole_amount:
        return await cls.Tree.Api.Discord.errors.apiDiscordAssignRoleLimit(
            cls, WebRequest, limit=cls.BASE.Limit.discord_assignrole_amount)

    cls.BASE.PhaazeDB.insertQuery(table="discord_assignrole",
                                  content={
                                      "guild_id": Create["guild_id"],
                                      "trigger": Create["trigger"],
                                      "role_id": str(AssignRole.id)
                                  })

    # logging
    GuildSettings: DiscordServerSettings = await getDiscordSeverSettings(
        PhaazeDiscord, Create["guild_id"], prevent_new=True)
    log_coro: Coroutine = loggingOnAssignroleCreate(
        PhaazeDiscord,
        GuildSettings,
        Creator=CheckMember,
        assign_role_id=Create["role_id"],
        trigger=Create["trigger"])
    asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

    cls.BASE.Logger.debug(
        f"(API/Discord) Assignroles: {Create['guild_id']=} added: {Create['trigger']=}",
        require="discord:configs")
    return cls.response(text=json.dumps(
        dict(msg="Assignroles: Added new entry",
             entry=Create["trigger"],
             status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 11
0
async def apiDiscordTwitchalertsEdit(cls: "PhaazebotWeb",
                                     WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/twitchalerts/edit
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Edit: StorageTransformer = StorageTransformer()
    Edit["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
    Edit["alert_id"] = Data.getStr("alert_id", UNDEFINED, must_be_digit=True)

    # checks
    if not Edit["alert_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'alert_id'")

    if not Edit["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    # get/check discord
    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Edit["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    # get alert
    res_alerts: list = await getDiscordServerTwitchAlerts(
        PhaazeDiscord,
        discord_guild_id=Edit["guild_id"],
        alert_id=Edit["alert_id"])

    if not res_alerts:
        return await cls.Tree.Api.Discord.Twitchalerts.errors.apiDiscordAlertNotExists(
            cls, WebRequest, alert_id=Edit["guild_id"])

    CurrentEditAlert: DiscordTwitchAlert = res_alerts.pop(0)

    # check all update values
    update: dict = dict()

    Edit["custom_msg"] = Data.getStr("custom_msg",
                                     UNDEFINED,
                                     len_max=MAX_CONTENT_SIZE,
                                     allow_none=True)
    if Edit["custom_msg"] != UNDEFINED:
        update["custom_msg"] = Edit["custom_msg"]

    Edit["suppress_gamechange"] = Data.getBool("suppress_gamechange",
                                               UNDEFINED)
    if Edit["suppress_gamechange"] != UNDEFINED:
        update["suppress_gamechange"] = Edit["suppress_gamechange"]

    if not update:
        return await cls.Tree.Api.errors.apiWrongData(
            cls, WebRequest, msg=f"No changes, please add at least one")

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Edit["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Edit["guild_id"],
            user_id=AuthDiscord.User.user_id)

    cls.BASE.PhaazeDB.updateQuery(
        table="discord_twitch_alert",
        content=update,
        where=
        "`discord_twitch_alert`.`discord_guild_id` = %s AND `discord_twitch_alert`.`id` = %s",
        where_values=(CurrentEditAlert.guild_id, CurrentEditAlert.alert_id))

    # logging
    GuildSettings: DiscordServerSettings = await getDiscordSeverSettings(
        PhaazeDiscord, Edit["guild_id"], prevent_new=True)
    log_coro: Coroutine = loggingOnTwitchalertEdit(
        PhaazeDiscord,
        GuildSettings,
        ChangeMember=CheckMember,
        twitch_channel=CurrentEditAlert.twitch_channel_name,
        discord_channel_id=CurrentEditAlert.discord_channel_id,
        changes=update)
    asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

    cls.BASE.Logger.debug(
        f"(API/Discord) Twitchalert: {Edit['guild_id']=} edited {Edit['alert_id']=}",
        require="discord:alerts")
    return cls.response(text=json.dumps(
        dict(msg="Twitchalert: Edited entry", changes=update, status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 12
0
async def apiDiscordCommandsGet(cls:"PhaazebotWeb", WebRequest:ExtendedRequest) -> Response:
	"""
	Default url: /api/discord/commands/get
	"""
	Data:WebRequestContent = WebRequestContent(WebRequest)
	await Data.load()

	# get required vars
	Search:StorageTransformer = StorageTransformer()
	Search["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
	Search["command_id"] = Data.getStr("command_id", UNDEFINED, must_be_digit=True)
	Search["trigger"] = Data.getStr("trigger", UNDEFINED, len_min=1, len_max=128)
	Search["show_hidden"] = Data.getBool("show_hidden", False)
	Search["active"] = None if Search["show_hidden"] else 1
	Search["limit"] = Data.getInt("limit", DEFAULT_LIMIT, min_x=1, max_x=MAX_LIMIT)
	Search["offset"] = Data.getInt("offset", 0, min_x=0)

	# checks
	if not Search["guild_id"]:
		return await apiMissingData(cls, WebRequest, msg="missing or invalid 'guild_id'")

	PhaazeDiscord:"PhaazebotDiscord" = cls.BASE.Discord
	Guild:discord.Guild = discord.utils.get(PhaazeDiscord.guilds, id=int(Search["guild_id"]))
	if not Guild:
		return await apiDiscordGuildUnknown(cls, WebRequest)

	if Search["show_hidden"]:
		# user requested to get full information about commands, requires authorisation

		AuthDiscord:AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
		if not AuthDiscord.found:
			return await apiMissingAuthorisation(cls, WebRequest)

		# get member
		CheckMember:discord.Member = Guild.get_member(int(AuthDiscord.User.user_id))
		if not CheckMember:
			return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(cls, WebRequest, guild_id=Search["guild_id"], user_id=AuthDiscord.User.user_id)

		# check permissions
		if not (CheckMember.guild_permissions.administrator or CheckMember.guild_permissions.manage_guild):
			return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
				cls,
				WebRequest,
				guild_id=Search["guild_id"],
				user_id=AuthDiscord.User.user_id,
				msg="'administrator' or 'manage_guild' permission required to show commands with hidden properties"
			)

	res_commands:List[DiscordCommand] = await getDiscordServerCommands(PhaazeDiscord, **Search.getAllTransform())

	result:Dict[str, Any] = dict(
		result=[Command.toJSON(show_hidden=Search["show_hidden"]) for Command in res_commands],
		limit=Search["limit"],
		offset=Search["offset"],
		total=await getDiscordServerCommands(PhaazeDiscord, count_mode=True, **Search.getAllTransform()),
		status=200
	)

	return cls.response(
		text=json.dumps(result),
		content_type="application/json",
		status=200
	)
Esempio n. 13
0
async def apiDiscordAssignrolesEdit(cls: "PhaazebotWeb",
                                    WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/assignroles/edit
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Edit: StorageTransformer = StorageTransformer()
    Edit["assignrole_id"] = Data.getInt("assignrole_id", "", min_x=1)
    Edit["guild_id"] = Data.getStr("guild_id", "", must_be_digit=True)

    # checks
    if not Edit["assignrole_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'assignrole_id'")

    if not Edit["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    # get/check discord
    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Edit["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    # check if exists
    res_assignroles: list = await getDiscordServerAssignRoles(
        PhaazeDiscord,
        guild_id=Edit["guild_id"],
        assignrole_id=Edit["assignrole_id"])

    if not res_assignroles:
        return await cls.Tree.Api.Discord.errors.apiDiscordAssignRoleNotExists(
            cls, WebRequest, assignrole_id=Edit["assignrole_id"])

    AssignRoleToEdit: DiscordAssignRole = res_assignroles.pop(0)

    # check all update values
    update: dict = dict()

    Edit["role_id"] = Data.getStr("role_id", UNDEFINED, must_be_digit=True)
    if Edit["role_id"] != UNDEFINED:
        AssignRole: discord.Role = getDiscordRoleFromString(
            PhaazeDiscord, Guild, Edit["role_id"])
        if not AssignRole:
            return await cls.Tree.Api.Discord.errors.apiDiscordRoleNotFound(
                cls,
                WebRequest,
                guild_name=Guild.name,
                guild_id=Guild.id,
                role_id=Edit["role_id"])

        if AssignRole > Guild.me.top_role or AssignRole == Guild.default_role:
            return await cls.Tree.Api.errors.apiWrongData(
                cls,
                WebRequest,
                msg=f"The Role `{AssignRole.name}` is to high")

        update["role_id"] = Edit["role_id"]

    Edit["trigger"] = Data.getStr("trigger", "").lower().split(" ")[0]
    if Edit["trigger"]:
        # try to get command with this trigger
        check_double_trigger: list = await getDiscordServerAssignRoles(
            cls.BASE.Discord,
            guild_id=Edit["guild_id"],
            trigger=Edit["trigger"])
        if check_double_trigger:
            AssignRoleToCheck: DiscordAssignRole = check_double_trigger.pop(0)
            # tried to set a trigger twice
            if str(AssignRoleToEdit.assignrole_id) != str(
                    AssignRoleToCheck.assignrole_id):
                return await cls.Tree.Api.Discord.Assignroles.errors.apiDiscordAssignRoleExists(
                    cls, WebRequest, trigger=Edit["trigger"])

        update["trigger"] = Edit["trigger"]

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Edit["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Edit["guild_id"],
            user_id=AuthDiscord.User.user_id)

    if not update:
        return await cls.Tree.Api.errors.apiWrongData(
            cls, WebRequest, msg=f"No changes, please add at least one")

    cls.BASE.PhaazeDB.updateQuery(
        table="discord_assignrole",
        content=update,
        where=
        "`discord_assignrole`.`guild_id` = %s AND `discord_assignrole`.`id` = %s",
        where_values=(AssignRoleToEdit.guild_id,
                      AssignRoleToEdit.assignrole_id))

    # logging
    GuildSettings: DiscordServerSettings = await getDiscordSeverSettings(
        PhaazeDiscord, Edit["guild_id"], prevent_new=True)
    log_coro: Coroutine = loggingOnAssignroleEdit(
        PhaazeDiscord,
        GuildSettings,
        Editor=CheckMember,
        assign_role_trigger=AssignRoleToEdit.trigger,
        changes=update)
    asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

    cls.BASE.Logger.debug(
        f"(API/Discord) Assignrole: {Edit['guild_id']=} edited {Edit['assignrole_id']=}",
        require="discord:role")
    return cls.response(text=json.dumps(
        dict(msg="Assignrole: Edited entry", changes=update, status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 14
0
async def apiDiscordCommandsEdit(cls:"PhaazebotWeb", WebRequest:ExtendedRequest) -> Response:
	"""
	Default url: /api/discord/commands/edit
	"""
	Data:WebRequestContent = WebRequestContent(WebRequest)
	await Data.load()

	# get required stuff
	Edit:StorageTransformer = StorageTransformer()
	Edit["command_id"] = Data.getInt("command_id", "", min_x=1)
	Edit["guild_id"] = Data.getStr("guild_id", "", must_be_digit=True)

	# checks
	if not Edit["command_id"]:
		return await cls.Tree.Api.errors.apiMissingData(cls, WebRequest, msg="missing or invalid 'command_id'")

	if not Edit["guild_id"]:
		return await cls.Tree.Api.errors.apiMissingData(cls, WebRequest, msg="missing or invalid 'guild_id'")

	# get/check discord
	PhaazeDiscord:"PhaazebotDiscord" = cls.BASE.Discord
	Guild:discord.Guild = discord.utils.get(PhaazeDiscord.guilds, id=int(Edit["guild_id"]))
	if not Guild:
		return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(cls, WebRequest)

	# check if exists
	res_commands:list = await getDiscordServerCommands(PhaazeDiscord, guild_id=Edit["guild_id"], command_id=Edit["command_id"], active=None)
	if not res_commands:
		return await cls.Tree.Api.Discord.Commands.errors.apiDiscordCommandNotExists(cls, WebRequest, command_id=Edit["command_id"])

	CurrentEditCommand:DiscordCommand = res_commands.pop(0)

	# after this point we have a existing command
	# check all possible values if it should be edited
	update:dict = dict()

	# active
	Edit["active"] = Data.getBool("active", UNDEFINED)
	if Edit["active"] != UNDEFINED:
		update["active"] = Edit["active"]

	# trigger
	Edit["trigger"] = Data.getStr("trigger", "", len_max=128).lower().split(" ")[0]
	if Edit["trigger"]:
		# try to get command with this trigger
		check_double_trigger:list = await getDiscordServerCommands(PhaazeDiscord, guild_id=Edit["guild_id"], trigger=Edit["trigger"])
		if check_double_trigger:
			CommandToCheck:DiscordCommand = check_double_trigger.pop(0)
			# tried to set a trigger twice
			if str(CommandToCheck.command_id) != str(CurrentEditCommand.command_id):
				return await cls.Tree.Api.Discord.Commands.errors.apiDiscordCommandExists(cls, WebRequest, trigger=Edit["trigger"])

		update["trigger"] = Edit["trigger"]

	# cooldown
	Edit["cooldown"] = Data.getInt("cooldown", UNDEFINED, min_x=0)
	if Edit["cooldown"] != UNDEFINED:
		# wants a invalid cooldown
		if not (cls.BASE.Limit.discord_commands_cooldown_min <= Edit["cooldown"] <= cls.BASE.Limit.discord_commands_cooldown_max):
			return await cls.Tree.Api.errors.apiWrongData(cls, WebRequest, msg="'cooldown' is wrong")

		update["cooldown"] = Edit["cooldown"]

	# currency
	Edit["required_currency"] = Data.getInt("required_currency", UNDEFINED, min_x=0)
	if Edit["required_currency"] != UNDEFINED:
		update["required_currency"] = Edit["required_currency"]

	# require
	Edit["require"] = Data.getInt("require", UNDEFINED, min_x=0)
	if Edit["require"] != UNDEFINED:
		update["require"] = Edit["require"]

	# content
	Edit["content"] = Data.getStr("content", UNDEFINED, len_max=1750)
	if Edit["content"] != UNDEFINED:
		update["content"] = Edit["content"]

	# hidden
	Edit["hidden"] = Data.getBool("hidden", UNDEFINED)
	if Edit["hidden"] != UNDEFINED:
		update["hidden"] = Edit["hidden"]

	# function (and type)
	Edit["complex"] = Data.getBool("complex", False)
	Edit["function"] = Data.getStr("function", UNDEFINED, len_max=256)
	if not Edit["complex"] and Edit["function"] != UNDEFINED:
		# it its not complex, we need a function
		if Edit["function"] not in [cmd["function"].__name__ for cmd in command_register]:
			return await cls.Tree.Api.errors.apiWrongData(cls, WebRequest, msg=f"'{Edit['function']}' is not a valid value for field 'function'")

		update["complex"] = Edit["complex"]
		update["function"] = Edit["function"]

	if Edit["complex"] and not Edit["function"]:
		# it is complex, we need a content
		if not update.get("content", ""):
			return await cls.Tree.Api.errors.apiWrongData(cls, WebRequest, msg=f"'complex' is true, but missing 'content'")

		update["complex"] = Edit["complex"]
		update["function"] = ""

	# get user info
	AuthDiscord:AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
	if not AuthDiscord.found:
		return await cls.Tree.Api.errors.apiMissingAuthorisation(cls, WebRequest)

	# get member
	CheckMember:discord.Member = Guild.get_member(int(AuthDiscord.User.user_id))
	if not CheckMember:
		return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(cls, WebRequest, guild_id=Edit["guild_id"], user_id=AuthDiscord.User.user_id)

	# check permissions
	if not (CheckMember.guild_permissions.administrator or CheckMember.guild_permissions.manage_guild):
		return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(cls, WebRequest, guild_id=Edit["guild_id"], user_id=AuthDiscord.User.user_id)

	if not update:
		return await cls.Tree.Api.errors.apiWrongData(cls, WebRequest, msg=f"No changes, please add at least one")

	cls.BASE.PhaazeDB.updateQuery(
		table="discord_command",
		content=update,
		where="`discord_command`.`guild_id` = %s AND `discord_command`.`id` = %s",
		where_values=(CurrentEditCommand.server_id, CurrentEditCommand.command_id)
	)

	# logging
	GuildSettings:DiscordServerSettings = await getDiscordSeverSettings(PhaazeDiscord, Edit["guild_id"], prevent_new=True)
	log_coro:Coroutine = loggingOnCommandEdit(PhaazeDiscord, GuildSettings, Editor=CheckMember, command_trigger=CurrentEditCommand.trigger, command_info=update)
	asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

	cls.BASE.Logger.debug(f"(API/Discord) Commands: {Edit['guild_id']=} edited {Edit['command_id']=}", require="discord:commands")
	return cls.response(
		text=json.dumps(dict(msg="Commands: Edited entry", changes=update, status=200)),
		content_type="application/json",
		status=200
	)
Esempio n. 15
0
async def apiDiscordRegularsCreate(cls: "PhaazebotWeb",
                                   WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/regulars/create
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Create: StorageTransformer = StorageTransformer()
    Create["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
    Create["member_id"] = Data.getStr("member_id",
                                      UNDEFINED,
                                      must_be_digit=True)

    # checks
    if not Create["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    if not Create["member_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'member_id'")

    # get/check discord
    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Create["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    ActionMember: discord.Member = getDiscordMemberFromString(
        PhaazeDiscord, Guild, Create["member_id"])
    if not ActionMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls, WebRequest, user_id=Create["member_id"])

    # check if already exists and limits
    res: list = cls.BASE.PhaazeDB.selectQuery(
        """
		SELECT
			COUNT(*) AS `all`,
			SUM(
				CASE WHEN `discord_regular`.`member_id` = %s
				THEN 1 ELSE 0 END
			) AS `match`
		FROM `discord_regular`
		WHERE `discord_regular`.`guild_id` = %s""",
        (str(ActionMember.id), str(ActionMember.guild.id)))

    if res[0]["match"]:
        return await cls.Tree.Api.Discord.Regulars.errors.apiDiscordRegularExists(
            cls, WebRequest)

    if res[0]["all"] >= cls.BASE.Limit.discord_regular_amount:
        return await cls.Tree.Api.Discord.Regulars.errors.apiDiscordRegularLimit(
            cls, WebRequest)

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    cls.BASE.PhaazeDB.insertQuery(table="discord_regular",
                                  content={
                                      "guild_id": str(ActionMember.guild.id),
                                      "member_id": str(ActionMember.id)
                                  })

    # logging
    GuildSettings: DiscordServerSettings = await getDiscordSeverSettings(
        PhaazeDiscord, Create["guild_id"], prevent_new=True)
    log_coro: Coroutine = loggingOnRegularCreate(PhaazeDiscord,
                                                 GuildSettings,
                                                 Creator=CheckMember,
                                                 NewRegular=ActionMember)
    asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

    cls.BASE.Logger.debug(
        f"(API/Discord) Regular: {Create['guild_id']=} added new entry {Create['member_id']=}",
        require="discord:regulars")
    return cls.response(text=json.dumps(
        dict(msg="Regulars: Added new entry",
             entry=ActionMember.name,
             status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 16
0
async def apiDiscordConfigsGameEnabledChannelsCreate(
        cls: "PhaazebotWeb", WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/configs/gameenabledchannels/create
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Create: StorageTransformer = StorageTransformer()
    Create["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
    Create["channel_id"] = Data.getStr("channel_id",
                                       UNDEFINED,
                                       must_be_digit=True)

    # checks
    if not Create["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    if not Create["channel_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'channel_id'")

    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Create["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    ActionChannel: discord.TextChannel = getDiscordChannelFromString(
        PhaazeDiscord, Guild, Create["channel_id"], required_type="text")
    if not ActionChannel:
        return await cls.Tree.Api.Discord.errors.apiDiscordChannelNotFound(
            cls, WebRequest, channel_id=Create["channel_id"])

    # check if already exists
    res: list = cls.BASE.PhaazeDB.selectQuery(
        """
		SELECT COUNT(*) AS `match`
		FROM `discord_enabled_gamechannel`
		WHERE `discord_enabled_gamechannel`.`guild_id` = %s
			AND `discord_enabled_gamechannel`.`channel_id` = %s""",
        (Create["guild_id"], Create["channel_id"]))

    if res[0]["match"]:
        return await cls.Tree.Api.Discord.Configs.Gameenabledchannels.errors.apiDiscordConfigsGameEnabledChannelExists(
            cls,
            WebRequest,
            channel_id=Create["channel_id"],
            channel_name=ActionChannel.name)

    cls.BASE.PhaazeDB.insertQuery(table="discord_enabled_gamechannel",
                                  content={
                                      "guild_id": Create["guild_id"],
                                      "channel_id": Create["channel_id"]
                                  })

    cls.BASE.Logger.debug(
        f"(API/Discord) Game enabled channel: {Create['guild_id']=} added: {Create['channel_id']=}",
        require="discord:configs")
    return cls.response(text=json.dumps(
        dict(msg="Game enabled channel: Added new entry",
             entry=Create["channel_id"],
             status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 17
0
async def apiDiscordConfigsEdit(cls: "PhaazebotWeb",
                                WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/configs/edit
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Edit: StorageTransformer = StorageTransformer()
    Edit["guild_id"] = Data.getStr("guild_id", "", must_be_digit=True)

    # checks
    if not Edit["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Edit["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Edit["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    # to edit configs, at least moderator rights are needed, (there can be options that require server only duh)
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Edit["guild_id"],
            user_id=AuthDiscord.User.user_id)

    Configs: DiscordServerSettings = await getDiscordSeverSettings(
        PhaazeDiscord, origin=Edit["guild_id"], prevent_new=True)

    if not Configs:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest, msg="Could not find configs for this guild")

    # check all update values
    update: dict = dict()

    Edit["autorole_id"] = Data.getStr("autorole_id",
                                      UNDEFINED,
                                      len_max=128,
                                      allow_none=True)
    if Edit["autorole_id"] != UNDEFINED:
        error: bool = False
        if not Edit["autorole_id"]:
            update["autorole_id"] = None
        else:
            Role: discord.Role = getDiscordRoleFromString(
                PhaazeDiscord, Guild, Edit["autorole_id"])
            if not Role:
                error = True
            elif Role >= Guild.me.top_role:
                return await cls.Tree.Api.errors.apiWrongData(
                    cls, WebRequest, msg=f"The Role `{Role.name}` is to high")
            else:
                update["autorole_id"] = str(Role.id)

        if error:
            return await cls.Tree.Api.errors.apiWrongData(
                cls,
                WebRequest,
                msg=
                f"{Edit['autorole_id']} could not be resolved as a valid discord role"
            )

    # blacklist_ban_links
    Edit["blacklist_ban_links"] = Data.getBool("blacklist_ban_links",
                                               UNDEFINED)
    if Edit["blacklist_ban_links"] != UNDEFINED:
        update["blacklist_ban_links"] = Edit["blacklist_ban_links"]

    # blacklist_punishment
    Edit["blacklist_punishment"] = Data.getStr("blacklist_punishment",
                                               UNDEFINED,
                                               len_max=32)
    if Edit["blacklist_punishment"] != UNDEFINED:
        Edit["blacklist_punishment"] = checkPunishmentString(
            Edit["blacklist_punishment"])
        update["blacklist_punishment"] = Edit["blacklist_punishment"]

    # currency_name
    Edit["currency_name"] = Data.getStr("currency_name",
                                        UNDEFINED,
                                        len_max=256,
                                        allow_none=True)
    if Edit["currency_name"] != UNDEFINED:
        if not Edit['currency_name']:
            update["currency_name"] = None
        else:
            update["currency_name"] = Edit["currency_name"]

    # currency_name_multi
    Edit["currency_name_multi"] = Data.getStr("currency_name_multi",
                                              UNDEFINED,
                                              len_max=256,
                                              allow_none=True)
    if Edit["currency_name_multi"] != UNDEFINED:
        if not Edit["currency_name_multi"]:
            update["currency_name_multi"] = None
        else:
            update["currency_name_multi"] = Edit["currency_name_multi"]

    # leave_chan
    Edit["leave_chan"] = Data.getStr("leave_chan",
                                     UNDEFINED,
                                     len_max=128,
                                     allow_none=True)
    if Edit["leave_chan"] != UNDEFINED:
        error: bool = False
        if not Edit["leave_chan"]:
            update["leave_chan"] = None
        else:
            Chan: discord.TextChannel = getDiscordChannelFromString(
                PhaazeDiscord, Guild, Edit["leave_chan"], required_type="text")
            if not Chan:
                error = True
            else:
                update["leave_chan"] = str(Chan.id)

        if error:
            return await cls.Tree.Api.errors.apiWrongData(
                cls,
                WebRequest,
                msg=
                f"'{Edit['leave_chan']}' could not be resolved as a valid discord text channel"
            )

    # leave_msg
    Edit["leave_msg"] = Data.getStr("leave_msg",
                                    UNDEFINED,
                                    len_max=1750,
                                    allow_none=True)
    if Edit["leave_msg"] != UNDEFINED:
        if not Edit["leave_msg"]:
            update["leave_msg"] = None
        else:
            update["leave_msg"] = Edit["leave_msg"]

    # level_custom_msg
    Edit["level_custom_msg"] = Data.getStr("level_custom_msg",
                                           UNDEFINED,
                                           len_max=1750,
                                           allow_none=True)
    if Edit["level_custom_msg"] != UNDEFINED:
        if not Edit["level_custom_msg"]:
            update["level_custom_msg"] = None
        else:
            update["level_custom_msg"] = Edit["level_custom_msg"]

    # level_announce_chan
    Edit["level_announce_chan"] = Data.getStr("level_announce_chan",
                                              UNDEFINED,
                                              len_max=128,
                                              allow_none=True)
    if Edit["level_announce_chan"] != UNDEFINED:
        error: bool = False
        if not Edit["level_announce_chan"]:
            update["level_announce_chan"] = None
        else:
            Chan: discord.TextChannel = getDiscordChannelFromString(
                PhaazeDiscord,
                Guild,
                Edit["level_announce_chan"],
                required_type="text")
            if not Chan:
                error = True
            else:
                update["level_announce_chan"] = str(Chan.id)

        if error:
            return await cls.Tree.Api.errors.apiWrongData(
                cls,
                WebRequest,
                msg=
                f"'{Edit['level_announce_chan']}' could not be resolved as a valid discord text channel"
            )

        update["level_announce_chan"] = Edit["level_announce_chan"]

    # owner_disable_level
    Edit["owner_disable_level"] = Data.getBool("owner_disable_level",
                                               UNDEFINED)
    if Edit["owner_disable_level"] != UNDEFINED:
        if not Guild.owner == CheckMember:
            return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
                cls,
                WebRequest,
                guild_id=Edit["guild_id"],
                user_id=AuthDiscord.User.user_id,
                msg="changing 'owner_disable_level' require server owner")
        update["owner_disable_level"] = Edit["owner_disable_level"]

    # owner_disable_normal
    Edit["owner_disable_normal"] = Data.getBool("owner_disable_normal",
                                                UNDEFINED)
    if Edit["owner_disable_normal"] != UNDEFINED:
        if not Guild.owner == CheckMember:
            return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
                cls,
                WebRequest,
                guild_id=Edit["guild_id"],
                user_id=AuthDiscord.User.user_id,
                msg="changing 'owner_disable_level' require server owner")
        update["owner_disable_normal"] = Edit["owner_disable_normal"]

    # owner_disable_regular
    Edit["owner_disable_regular"] = Data.getBool("owner_disable_regular",
                                                 UNDEFINED)
    if Edit["owner_disable_regular"] != UNDEFINED:
        if not Guild.owner == CheckMember:
            return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
                cls,
                WebRequest,
                guild_id=Edit["guild_id"],
                user_id=AuthDiscord.User.user_id,
                msg="changing 'owner_disable_level' require server owner")
        update["owner_disable_regular"] = Edit["owner_disable_regular"]

    # owner_disable_mod
    Edit["owner_disable_mod"] = Data.getBool("owner_disable_mod", UNDEFINED)
    if Edit["owner_disable_mod"] != UNDEFINED:
        if not Guild.owner == CheckMember:
            return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
                cls,
                WebRequest,
                guild_id=Edit["guild_id"],
                user_id=AuthDiscord.User.user_id,
                msg="changing 'owner_disable_level' require server owner")
        update["owner_disable_mod"] = Edit["owner_disable_mod"]

    # track_channel
    Edit["track_channel"] = Data.getStr("track_channel",
                                        UNDEFINED,
                                        len_max=128,
                                        allow_none=True)
    if Edit["track_channel"] != UNDEFINED:
        error: bool = False
        if not Edit["track_channel"]:
            update["track_channel"] = Edit["track_channel"]
        else:
            Chan: discord.TextChannel = getDiscordChannelFromString(
                PhaazeDiscord,
                Guild,
                Edit["track_channel"],
                required_type="text")
            if not Chan:
                error = True
            else:
                update["track_channel"] = str(Chan.id)

        if error:
            return await cls.Tree.Api.errors.apiWrongData(
                cls,
                WebRequest,
                msg=
                f"'{Edit['track_channel']}' could not be resolved as a valid discord text channel"
            )

    # track_value
    Edit["track_value"] = Data.getInt("track_value", UNDEFINED, min_x=0)
    if Edit["track_value"] != UNDEFINED:
        update["track_value"] = Edit["track_value"]

    # welcome_chan
    Edit["welcome_chan"] = Data.getStr("welcome_chan",
                                       UNDEFINED,
                                       len_max=128,
                                       allow_none=True)
    if Edit["welcome_chan"] != UNDEFINED:
        error: bool = False
        if not Edit["welcome_chan"]:
            update["welcome_chan"] = None
        else:
            Chan: discord.TextChannel = getDiscordChannelFromString(
                PhaazeDiscord,
                Guild,
                Edit["welcome_chan"],
                required_type="text")
            if not Chan:
                error = True
            else:
                update["welcome_chan"] = str(Chan.id)

        if error:
            return await cls.Tree.Api.errors.apiWrongData(
                cls,
                WebRequest,
                msg=
                f"'{Edit['welcome_chan']}' could not be resolved as a valid discord text channel"
            )

    # welcome_msg
    Edit["welcome_msg"] = Data.getStr("welcome_msg",
                                      UNDEFINED,
                                      len_max=1750,
                                      allow_none=True)
    if Edit["welcome_msg"] != UNDEFINED:
        if not Edit["welcome_msg"]:
            update["welcome_msg"] = None
        else:
            update["welcome_msg"] = Edit["welcome_msg"]

    # welcome_msg_priv
    Edit["welcome_msg_priv"] = Data.getStr("welcome_msg_priv",
                                           UNDEFINED,
                                           len_max=1750,
                                           allow_none=True)
    if Edit["welcome_msg_priv"] != UNDEFINED:
        if not Edit["welcome_msg_priv"]:
            update["welcome_msg_priv"] = None
        else:
            update["welcome_msg_priv"] = Edit["welcome_msg_priv"]

    if not update:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="No changes, please add at least one")

    cls.BASE.PhaazeDB.updateQuery(table="discord_setting",
                                  content=update,
                                  where="`discord_setting`.`guild_id` = %s",
                                  where_values=(Edit["guild_id"], ))

    # logging
    log_coro: Coroutine = loggingOnConfigEdit(PhaazeDiscord,
                                              Configs,
                                              Editor=CheckMember,
                                              changes=update)
    asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

    cls.BASE.Logger.debug(
        f"(API/Discord) Configs: {Edit['guild_id']=} updated",
        require="discord:configs")
    return cls.response(text=json.dumps(
        dict(msg="Configs: Updated", changes=update, status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 18
0
async def apiDiscordQuotesCreate(cls: "PhaazebotWeb",
                                 WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/quotes/create
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Create: StorageTransformer = StorageTransformer()
    Create["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
    Create["content"] = Data.getStr("content",
                                    UNDEFINED,
                                    len_max=MAX_QUOTE_SIZE)

    # checks
    if not Create["guild_id"]:
        return await apiMissingData(cls,
                                    WebRequest,
                                    msg="missing or invalid 'guild_id'")

    if not Create["content"]:
        return await apiMissingData(cls,
                                    WebRequest,
                                    msg="missing or invalid 'content'")

    # get/check discord
    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Create["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    # check limit
    res: list = cls.BASE.PhaazeDB.selectQuery(
        """
		SELECT COUNT(*) AS `I`
		FROM `discord_quote`
		WHERE `discord_quote`.`guild_id` = %s""", (Create["guild_id"], ))

    if res[0]['I'] >= cls.BASE.Limit.discord_quotes_amount:
        return await cls.Tree.Api.Discord.Quotes.errors.apiDiscordQuoteLimit(
            cls, WebRequest)

    # get user info
    DiscordUser: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not DiscordUser.found:
        return await apiMissingAuthorisation(cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(DiscordUser.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=DiscordUser.User.user_id)

    # check permissions
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=DiscordUser.User.user_id)

    new_quote_id: int = cls.BASE.PhaazeDB.insertQuery(table="discord_quote",
                                                      content={
                                                          "guild_id":
                                                          Create["guild_id"],
                                                          "content":
                                                          Create["content"]
                                                      })

    # logging
    GuildSettings: DiscordServerSettings = await getDiscordSeverSettings(
        PhaazeDiscord, Create["guild_id"], prevent_new=True)
    log_coro: Coroutine = loggingOnQuoteCreate(PhaazeDiscord,
                                               GuildSettings,
                                               Creator=CheckMember,
                                               quote_content=Create["content"],
                                               quote_id=new_quote_id)
    asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

    cls.BASE.Logger.debug(
        f"(API/Discord) Quote: {Create['guild_id']=} added new entry",
        require="discord:quotes")
    return cls.response(text=json.dumps(
        dict(msg="Quote: Added new entry", entry=Create["content"],
             status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 19
0
async def apiDiscordLevelsGet(cls:"PhaazebotWeb", WebRequest:ExtendedRequest) -> Response:
	"""
	Default url: /api/discord/levels/get
	"""
	Data:WebRequestContent = WebRequestContent(WebRequest)
	await Data.load()

	# get required stuff
	Search:StorageTransformer = StorageTransformer()

	Search["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
	Search["member_id"] = Data.getStr("member_id", UNDEFINED, must_be_digit=True)
	Search["detailed"] = Data.getBool("detailed", False) # with names, avatar hash etc.
	Search["nickname"] = Data.getBool("nickname", False) # usernames or nicknames?
	Search["name_contains"] = Data.getStr("name_contains", UNDEFINED)
	Search["edited"] = Data.getInt("edited", UNDEFINED) # 0 = only non-edited, 1 = only edited
	Search["order"] = Data.getStr("order", UNDEFINED)
	Search["limit"] = Data.getInt("limit", DEFAULT_LIMIT, min_x=1, max_x=MAX_LIMIT)
	Search["offset"] = Data.getInt("offset", 0, min_x=0)

	Search.addProtected("detailed")
	Search.addProtected("nickname")

	# checks
	if not Search["guild_id"]:
		return await apiMissingData(cls, WebRequest, msg="missing or invalid 'guild_id'")

	# format
	if Search["order"] == "id":
		Search["order_str"] = "ORDER BY `id`"
	elif Search["order"] == "member_id":
		Search["order_str"] = "ORDER BY `member_id`"
	elif Search["order"] == "currency":
		Search["order_str"] = "ORDER BY `currency` DESC"
	else:
		Search["order_str"] = "ORDER BY `exp` DESC"

	PhaazeDiscord:"PhaazebotDiscord" = cls.BASE.Discord
	Guild:discord.Guild = discord.utils.get(PhaazeDiscord.guilds, id=int(Search["guild_id"]))
	if not Guild:
		return await apiDiscordGuildUnknown(cls, WebRequest)

	# get levels
	res_levels:list = await getDiscordServerUsers(PhaazeDiscord, **Search.getAllTransform())

	return_list:list = list()

	for LevelUser in res_levels:

		level_user:dict = LevelUser.toJSON()

		if Search["detailed"]:
			Mem:discord.Member = Guild.get_member(int(LevelUser.member_id))
			level_user["avatar"] = Mem.avatar if Mem else None
			level_user["level"] = LevelCalc.getLevel(LevelUser.exp)
			if not Mem:
				level_user["username"] = "******"
			else:
				if Search["nickname"] and Mem.nick:
					level_user["username"] = Mem.nick
				else:
					level_user["username"] = Mem.name

		return_list.append(level_user)

	result:Dict[str, Any] = dict(
		result=return_list,
		total=await getDiscordServerUsers(PhaazeDiscord, count_mode=True, **Search.getAllTransform()),
		limit=Search["limit"],
		offset=Search["offset"],
		detailed=Search["detailed"],
		status=200
	)

	return cls.response(
		text=json.dumps(result),
		content_type="application/json",
		status=200
	)
Esempio n. 20
0
async def apiAccountEditPhaaze(cls: "PhaazebotWeb",
                               WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/account/phaaze/edit
	"""
    WebAuth: AuthWebUser = await authWebUser(cls, WebRequest)

    if not WebAuth.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Edit: StorageTransformer = StorageTransformer()
    Edit["current_password"] = Data.getStr("password", UNDEFINED, len_max=256)
    Edit["new_username"] = Data.getStr("username", UNDEFINED, len_max=64)
    Edit["new_email"] = Data.getStr("email", UNDEFINED, len_max=128)
    Edit["new_password"] = Data.getStr("newpassword", UNDEFINED, len_max=256)
    Edit["new_password2"] = Data.getStr("newpassword2", UNDEFINED, len_max=256)

    # checks
    if not Edit[
            "current_password"] or WebAuth.User.password != passwordFunction(
                Edit["current_password"]):
        return await cls.Tree.Api.Account.errors.apiAccountPasswordsDontMatch(
            cls, WebRequest, msg="Current password is not correct")

    changed_email: bool = False  # if yes, reset validate and send mail

    update: dict = dict()

    # if new_password is set, check all and set to update
    if Edit["new_password"]:
        if Edit["new_password"] != Edit["new_password2"]:
            return await cls.Tree.Api.Account.errors.apiAccountPasswordsDontMatch(
                cls, WebRequest)

        if len(Edit["new_password"]) < 8:
            return await cls.Tree.Api.Account.errors.apiAccountPasswordToShort(
                cls, WebRequest, min_length=8)

        update["password"] = passwordFunction(Edit["new_password"])

    if Edit["new_username"]:
        # want a new username
        if Edit["new_username"].lower() != WebAuth.User.username.lower():
            is_occupied: list = await getWebUsers(
                cls,
                overwrite_where=" AND LOWER(`user`.`username`) = LOWER(%s)",
                overwrite_where_values=(Edit["new_username"], ))
            if is_occupied:
                # already taken
                return await cls.Tree.Api.Account.errors.apiAccountTaken(
                    cls, WebRequest)

            else:
                # username is free, add to update and add one to username_changed,
                # maybe i do something later with it
                update["username_changed"] = WebAuth.User.username_changed + 1
                update["username"] = Edit["new_username"]

        # else, it's a different capitation or so
        elif Edit["new_username"] != WebAuth.User.username:
            update["username"] = Edit["new_username"]

    if Edit["new_email"] and Edit["new_email"].lower() != WebAuth.User.email:
        if re.match(IsEmail, Edit["new_email"]) is None:
            # does not look like a email
            return await cls.Tree.Api.Account.errors.apiAccountEmailWrong(
                cls, WebRequest, email=Edit["new_email"])

        is_occupied: list = await getWebUsers(cls,
                                              email_contains=Edit["new_email"])
        if is_occupied:
            # already taken
            return await cls.Tree.Api.Account.errors.apiAccountTaken(
                cls, WebRequest)

        else:
            changed_email = True
            update["email"] = Edit["new_email"]

    if not update:
        return await cls.Tree.Api.errors.apiWrongData(
            cls, WebRequest, msg=f"No changes, please add at least one")

    # verification mail
    if changed_email:
        cls.BASE.Logger.warning(
            f"(API) New Email, send new verification mail: {Edit['new_email']}"
        )
        # TODO: SEND MAIL

    update["edited_at"] = str(datetime.datetime.now())

    cls.BASE.PhaazeDB.updateQuery(table="user",
                                  content=update,
                                  where="`user`.`id` = %s",
                                  where_values=(WebAuth.User.user_id, ))

    cls.BASE.Logger.debug(
        f"(API) Account edit ({WebAuth.User.user_id}) : {str(update)}",
        require="api:account")
    return cls.response(status=200,
                        text=json.dumps(
                            dict(error="successful_edited",
                                 msg="Your account has been successful edited",
                                 update=update,
                                 status=200)),
                        content_type="application/json")
Esempio n. 21
0
async def apiDiscordTwitchalertsCreate(
        cls: "PhaazebotWeb", WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/twitchalerts/create
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Create: StorageTransformer = StorageTransformer()
    Create["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
    Create["discord_channel_id"] = Data.getStr("discord_channel_id",
                                               UNDEFINED,
                                               must_be_digit=True)
    Create["twitch_channel"] = Data.getStr("twitch_channel", UNDEFINED)
    Create["custom_msg"] = Data.getStr("custom_msg",
                                       None,
                                       len_max=MAX_CONTENT_SIZE,
                                       allow_none=True)
    Create["suppress_gamechange"] = Data.getBool("suppress_gamechange", False)

    # checks
    if not Create["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    if not Create["discord_channel_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'discord_channel_id'")

    if not Create["twitch_channel"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'twitch_channel'")

    # get/check discord
    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Create["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    TargetDiscordChannel: discord.TextChannel = getDiscordChannelFromString(
        PhaazeDiscord,
        Guild,
        Create["discord_channel_id"],
        required_type="text")
    if not TargetDiscordChannel:
        return await cls.Tree.Api.Discord.errors.apiDiscordChannelNotFound(
            cls, WebRequest, msg=f"Could not find a valid text channel")

    Match: re.Match = TwitchRe().ChannelLink.match(Create["twitch_channel"])
    if Match:
        Create["twitch_channel"] = Match.group("name")

    user_res: list = await getTwitchUsers(cls.BASE,
                                          item=Create["twitch_channel"],
                                          item_type="login")
    if not user_res:
        return await cls.Tree.Api.Twitch.errors.apiTwitchUserNotFound(
            cls, WebRequest, user_name=Create["twitch_channel"])

    FoundUser: TwitchUser = user_res.pop(0)

    # check if already exists and limits
    res: list = cls.BASE.PhaazeDB.selectQuery(
        """
		SELECT
			COUNT(*) AS `all`,
			SUM(
				CASE WHEN `discord_twitch_alert`.`twitch_channel_id` = %(twitch_channel_id)s
				THEN 1 ELSE 0 END
			) AS `twitch_channel_match`,
			SUM(
				CASE WHEN `discord_twitch_alert`.`discord_channel_id` = %(discord_channel_id)s
				THEN 1 ELSE 0 END
			) AS `discord_channel_match`,
			SUM(
				CASE WHEN `discord_twitch_alert`.`discord_channel_id` = %(discord_channel_id)s
					AND `discord_twitch_alert`.`twitch_channel_id` = %(twitch_channel_id)s
				THEN 1 ELSE 0 END
			) AS `both_match`
		FROM `discord_twitch_alert`
		WHERE `discord_twitch_alert`.`discord_guild_id` = %(discord_guild_id)s""",
        dict(discord_guild_id=Create["guild_id"],
             discord_channel_id=str(TargetDiscordChannel.id),
             twitch_channel_id=FoundUser.user_id))

    if res[0]["all"] == 0:
        res[0]["twitch_channel_match"] = 0
        res[0]["discord_channel_match"] = 0
        res[0]["both_match"] = 0

    if res[0]["twitch_channel_match"] >= MAX_SAME_TWITCH_ALERTS_PER_GUILD:
        return await cls.Tree.Api.Discord.Twitchalerts.errors.apiDiscordAlertSameTwitchChannelLimit(
            cls,
            WebRequest,
            limit=MAX_SAME_TWITCH_ALERTS_PER_GUILD,
            twitch_name=FoundUser.display_name)

    if res[0]["discord_channel_match"] >= 1:
        # nothing... for now
        pass

    if res[0]["both_match"] >= 1:
        return await cls.Tree.Api.Discord.Twitchalerts.errors.apiDiscordAlertExists(
            cls,
            WebRequest,
            twitch_name=FoundUser.login,
            discord_id=TargetDiscordChannel.id)

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    cls.BASE.PhaazeDB.insertQuery(table="discord_twitch_alert",
                                  content={
                                      "discord_guild_id":
                                      Create["guild_id"],
                                      "discord_channel_id":
                                      str(TargetDiscordChannel.id),
                                      "twitch_channel_id":
                                      FoundUser.user_id,
                                      "custom_msg":
                                      Create["custom_msg"],
                                      "suppress_gamechange":
                                      Create["suppress_gamechange"]
                                  })

    # logging
    GuildSettings: DiscordServerSettings = await getDiscordSeverSettings(
        PhaazeDiscord, Create["guild_id"], prevent_new=True)
    log_coro: Coroutine = loggingOnTwitchalertCreate(
        PhaazeDiscord,
        GuildSettings,
        Creator=CheckMember,
        discord_channel=TargetDiscordChannel.name,
        twitch_channel=FoundUser.login)
    asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

    # some after work, with the new data
    await placeGatheredData(cls, FoundUser)
    cls.BASE.Logger.debug(
        f"(API/Discord) Twitchalert: {Create['guild_id']=} added {FoundUser.user_id=}",
        require="discord:alert")
    return cls.response(text=json.dumps(
        dict(msg="Twitchalert: Added new entry",
             entry=FoundUser.user_type,
             status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 22
0
async def apiDiscordCommandsCreate(cls: "PhaazebotWeb",
                                   WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/commands/create
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Create: StorageTransformer = StorageTransformer()
    Create["guild_id"] = Data.getStr("guild_id", "", must_be_digit=True)
    Create["trigger"] = Data.getStr("trigger", "").lower().split(" ")[0]
    Create["active"] = Data.getBool("active", True)
    Create["complex"] = Data.getBool("complex", False)
    Create["function"] = Data.getStr("function", "", len_max=256)
    Create["content"] = Data.getStr("content", "", len_max=1750)
    Create["hidden"] = Data.getBool("hidden", False)
    Create["cooldown"] = Data.getInt(
        "cooldown", cls.BASE.Limit.discord_commands_cooldown_min)
    Create["require"] = Data.getInt("require", 0, min_x=0)
    Create["required_currency"] = Data.getInt("required_currency", 0, min_x=0)

    # checks
    if not Create["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    if not Create["trigger"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing 'trigger'")

    if not (cls.BASE.Limit.discord_commands_cooldown_min <= Create["cooldown"]
            <= cls.BASE.Limit.discord_commands_cooldown_max):
        return await cls.Tree.Api.errors.apiWrongData(
            cls, WebRequest, msg="'cooldown' is wrong")

    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Create["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    # if not complex
    # check if the function actually exists
    if not Create["complex"]:
        if not Create["function"]:
            return await cls.Tree.Api.errors.apiMissingData(
                cls, WebRequest, msg="missing 'function'")
        if Create["function"] not in [
                cmd["function"].__name__ for cmd in command_register
        ]:
            return await cls.Tree.Api.errors.apiWrongData(
                cls,
                WebRequest,
                msg=
                f"'{Create['function']}' is not a valid value for field 'function'"
            )

    # check if already exists and limits
    res: list = cls.BASE.PhaazeDB.selectQuery(
        """
		SELECT
			COUNT(*) AS `all`,
			SUM(
				CASE WHEN LOWER(`discord_command`.`trigger`) = LOWER(%s)
				THEN 1 ELSE 0 END
			) AS `match`
		FROM `discord_command`
		WHERE `discord_command`.`guild_id` = %s""",
        (Create["trigger"], Create["guild_id"]))

    if res[0]["match"]:
        return await cls.Tree.Api.Discord.Commands.errors.apiDiscordCommandExists(
            cls, WebRequest, trigger=Create["trigger"])

    if res[0]["all"] >= cls.BASE.Limit.discord_commands_amount:
        return await cls.Tree.Api.Discord.Commands.errors.apiDiscordCommandLimit(
            cls, WebRequest, limit=cls.BASE.Limit.discord_commands_amount)

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    cls.BASE.PhaazeDB.insertQuery(table="discord_command",
                                  content=Create.getAllTransform())

    # logging prep
    log_dict: dict = Create.getAllTransform()

    # logging
    GuildSettings: DiscordServerSettings = await getDiscordSeverSettings(
        PhaazeDiscord, Create["guild_id"], prevent_new=True)
    log_coro: Coroutine = loggingOnCommandCreate(
        PhaazeDiscord,
        GuildSettings,
        Creator=CheckMember,
        command_trigger=Create["trigger"],
        command_info=log_dict)
    asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

    cls.BASE.Logger.debug(
        f"(API/Discord) Commands: {Create['guild_id']=} added: {Create['trigger']=}",
        require="discord:commands")
    return cls.response(text=json.dumps(
        dict(msg="Commands: Added new entry",
             entry=Create["trigger"],
             status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 23
0
async def apiDiscordQuotesEdit(cls: "PhaazebotWeb",
                               WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/quotes/edit
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Edit: StorageTransformer = StorageTransformer()
    Edit["quote_id"] = Data.getStr("quote_id", UNDEFINED, must_be_digit=True)
    Edit["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)

    # checks
    if not Edit["quote_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'quote_id'")

    if not Edit["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Edit["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    # check if exists
    res_quotes: list = await getDiscordServerQuotes(cls.BASE.Discord,
                                                    guild_id=Edit["guild_id"],
                                                    quote_id=Edit["quote_id"])

    if not res_quotes:
        return await cls.Tree.Api.Discord.Quotes.errors.apiDiscordQuotesNotExists(
            cls, WebRequest, quote_id=Edit["quote_id"])

    QuoteToEdit: DiscordQuote = res_quotes.pop(0)

    # check all update values
    update: dict = dict()

    Edit["content"] = Data.getStr("content", UNDEFINED, len_max=MAX_QUOTE_SIZE)
    if Edit["content"] != UNDEFINED:
        update["content"] = Edit["content"]

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Edit["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Edit["guild_id"],
            user_id=AuthDiscord.User.user_id)

    cls.BASE.PhaazeDB.updateQuery(
        table="discord_quote",
        content=update,
        where="`discord_quote`.`guild_id` = %s AND `discord_quote`.`id` = %s",
        where_values=(QuoteToEdit.guild_id, QuoteToEdit.quote_id))

    # logging
    GuildSettings: DiscordServerSettings = await getDiscordSeverSettings(
        PhaazeDiscord, Edit["guild_id"], prevent_new=True)
    log_coro: Coroutine = loggingOnQuoteEdit(PhaazeDiscord,
                                             GuildSettings,
                                             ChangeMember=CheckMember,
                                             quote_id=QuoteToEdit.quote_id,
                                             old_content=QuoteToEdit.content,
                                             new_content=Edit["content"])
    asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

    cls.BASE.Logger.debug(
        f"(API/Discord) Quote: {Edit['guild_id']=} edited {Edit['quote_id']=}",
        require="discord:quotes")
    return cls.response(text=json.dumps(
        dict(msg="Quote: Edited entry", changes=update, status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 24
0
async def apiDiscordConfigsWhitelistedLinkCreate(
        cls: "PhaazebotWeb", WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/configs/whitelistedlinks/create
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Create: StorageTransformer = StorageTransformer()
    Create["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
    Create["link"] = Data.getStr("link", UNDEFINED, len_min=1, len_max=512)
    # checks
    if not Create["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    if not Create["link"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'link'")

    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Create["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check if already exists
    res: list = cls.BASE.PhaazeDB.selectQuery(
        """
		SELECT COUNT(*) AS `match`
		FROM `discord_blacklist_whitelistlink`
		WHERE `discord_blacklist_whitelistlink`.`guild_id` = %s
			AND `discord_blacklist_whitelistlink`.`link` = %s""",
        (Create["guild_id"], Create["link"]))

    if res[0]["match"]:
        return await cls.Tree.Api.Discord.Configs.Whitelistedlinks.errors.apiDiscordWhitelistedLinkExists(
            cls, WebRequest, link=Create["link"])

    cls.BASE.PhaazeDB.insertQuery(table="discord_blacklist_whitelistlink",
                                  content={
                                      "guild_id": Create["guild_id"],
                                      "link": Create["link"]
                                  })

    cls.BASE.Logger.debug(
        f"(API/Discord) Linkwhitelist: {Create['guild_id']=} added: {Create['link']=}",
        require="discord:configs")
    return cls.response(text=json.dumps(
        dict(msg="Linkwhitelist: Added new entry",
             entry=Create["link"],
             status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 25
0
async def apiDiscordRegularsGet(cls: "PhaazebotWeb",
                                WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/regulars/get
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Search: StorageTransformer = StorageTransformer()
    Search["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
    Search["regular_id"] = Data.getStr("regular_id",
                                       UNDEFINED,
                                       must_be_digit=True)
    Search["member_id"] = Data.getStr("member_id",
                                      UNDEFINED,
                                      must_be_digit=True)
    Search["nickname"] = Data.getBool("nickname",
                                      False)  # usernames or nicknames?
    Search["detailed"] = Data.getBool("detailed",
                                      False)  # with names, avatar hash etc.
    Search["limit"] = Data.getInt("limit",
                                  DEFAULT_LIMIT,
                                  min_x=1,
                                  max_x=MAX_LIMIT)
    Search["offset"] = Data.getInt("offset", 0, min_x=0)

    # checks
    if not Search["guild_id"]:
        return await apiMissingData(cls,
                                    WebRequest,
                                    msg="missing or invalid 'guild_id'")

    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Search["guild_id"]))
    if not Guild:
        return await apiDiscordGuildUnknown(cls, WebRequest)

    # get regulars
    res_regulars: List[DiscordRegular] = await getDiscordServerRegulars(
        PhaazeDiscord, **Search.getAllTransform())

    return_list: List[dict] = []

    for Regular in res_regulars:

        reg: dict = Regular.toJSON()

        if Search["detailed"]:
            Mem: discord.Member = Guild.get_member(int(Regular.member_id))
            reg["avatar"] = Mem.avatar if Mem else None

            if not Mem:
                reg["username"] = "******"
            else:
                if Search["nickname"] and Mem.nick:
                    reg["username"] = Mem.nick
                else:
                    reg["username"] = Mem.name

        return_list.append(reg)

    result: Dict[str, Any] = dict(result=return_list,
                                  detailed=Search["detailed"],
                                  total=await getDiscordServerRegulars(
                                      PhaazeDiscord,
                                      count_mode=True,
                                      **Search.getAllTransform()),
                                  limit=Search["limit"],
                                  offset=Search["offset"],
                                  status=200)

    return cls.response(text=json.dumps(result),
                        content_type="application/json",
                        status=200)
Esempio n. 26
0
async def apiDiscordLevelsMedalsCreate(
        cls: "PhaazebotWeb", WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/levels/medals/create
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Create: StorageTransformer = StorageTransformer()
    Create["guild_id"] = Data.getStr("guild_id", UNDEFINED, must_be_digit=True)
    Create["member_id"] = Data.getStr("member_id",
                                      UNDEFINED,
                                      must_be_digit=True)
    Create["name"] = Data.getStr("name", "", len_max=512)

    # checks
    if not Create["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    if not Create["member_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'member_id'")

    if not Create["name"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'name'")

    # get/check discord
    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Create["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    # check limit
    res: list = cls.BASE.PhaazeDB.selectQuery(
        """
		SELECT
			COUNT(*) AS `all`,
			SUM(
				CASE WHEN LOWER(`discord_user_medal`.`name`) = LOWER(%s)
				THEN 1 ELSE 0 END
			) AS `match`
		FROM `discord_user_medal`
		WHERE `discord_user_medal`.`guild_id` = %s
			AND `discord_user_medal`.`member_id` = %s""",
        (Create["name"], Create["guild_id"], Create["member_id"]))

    if res[0]['match']:
        return await cls.Tree.Api.Discord.Levels.Medals.errors.apiDiscordUserMedalExists(
            cls, WebRequest)

    if res[0]['all'] >= cls.BASE.Limit.discord_level_medal_amount:
        return await cls.Tree.Api.Discord.Levels.Medals.errors.apiDiscordUserMedalLimit(
            cls, WebRequest)

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Create["guild_id"],
            user_id=AuthDiscord.User.user_id)

    cls.BASE.PhaazeDB.insertQuery(table="discord_user_medal",
                                  content={
                                      "guild_id": Create["guild_id"],
                                      "member_id": Create["member_id"],
                                      "name": Create["name"]
                                  })

    # logging
    GuildSettings: DiscordServerSettings = await getDiscordSeverSettings(
        PhaazeDiscord, Create["guild_id"], prevent_new=True)
    log_coro: Coroutine = loggingOnLevelmedalCreate(
        PhaazeDiscord,
        GuildSettings,
        Creator=CheckMember,
        medal_member_id=Create["member_id"],
        medal_name=Create["name"])
    asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

    cls.BASE.Logger.debug(
        f"(API/Discord) User medal: {Create['guild_id']=} {Create['member_id']=} added new entry",
        require="discord:medals")
    return cls.response(text=json.dumps(
        dict(msg="Medal: Added new entry", entry=Create["name"], status=200)),
                        content_type="application/json",
                        status=200)
Esempio n. 27
0
async def apiDiscordLevelsEdit(cls: "PhaazebotWeb",
                               WebRequest: ExtendedRequest) -> Response:
    """
	Default url: /api/discord/levels/edit
	"""
    Data: WebRequestContent = WebRequestContent(WebRequest)
    await Data.load()

    # get required stuff
    Edit: StorageTransformer = StorageTransformer()
    Edit["guild_id"] = Data.getStr("guild_id", "", must_be_digit=True)
    Edit["member_id"] = Data.getStr("member_id", "", must_be_digit=True)

    # checks
    if not Edit["guild_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'guild_id'")

    if not Edit["member_id"]:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="missing or invalid 'member_id'")

    PhaazeDiscord: "PhaazebotDiscord" = cls.BASE.Discord
    Guild: discord.Guild = discord.utils.get(PhaazeDiscord.guilds,
                                             id=int(Edit["guild_id"]))
    if not Guild:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest)

    # get user info
    AuthDiscord: AuthDiscordWebUser = await authDiscordWebUser(cls, WebRequest)
    if not AuthDiscord.found:
        return await cls.Tree.Api.Discord.errors.apiMissingAuthorisation(
            cls, WebRequest)

    # get member
    CheckMember: discord.Member = Guild.get_member(
        int(AuthDiscord.User.user_id))
    if not CheckMember:
        return await cls.Tree.Api.Discord.errors.apiDiscordMemberNotFound(
            cls,
            WebRequest,
            guild_id=Edit["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # check permissions
    # to edit configs, at least moderator rights are needed, (there can be options that require server only duh)
    if not (CheckMember.guild_permissions.administrator
            or CheckMember.guild_permissions.manage_guild):
        return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
            cls,
            WebRequest,
            guild_id=Edit["guild_id"],
            user_id=AuthDiscord.User.user_id)

    # get level user
    res_level: list = await getDiscordServerUsers(PhaazeDiscord,
                                                  guild_id=Edit["guild_id"],
                                                  member_id=Edit["member_id"])
    if not res_level:
        return await cls.Tree.Api.Discord.errors.apiDiscordGuildUnknown(
            cls, WebRequest, msg="Could not find a level for this user")
    CurrentLevelUser: DiscordUserStats = res_level.pop(0)

    # check all update values
    update: dict = dict()

    # currency
    Edit["currency"] = Data.getInt("currency", UNDEFINED, min_x=0)
    if Edit["currency"] != UNDEFINED:
        update["currency"] = Edit["currency"]

    # exp
    Edit["exp"] = Data.getInt("exp", UNDEFINED, min_x=0)
    if Edit["exp"] != UNDEFINED:
        update["exp"] = Edit["exp"]

        if Edit["exp"] != 0:
            update["edited"] = 1
        else:
            update["edited"] = 0

    # on_server
    Edit["on_server"] = Data.getBool("on_server", UNDEFINED)
    if Edit["on_server"] != UNDEFINED:
        if not Guild.owner == CheckMember:
            return await cls.Tree.Api.Discord.errors.apiDiscordMissingPermission(
                cls,
                WebRequest,
                guild_id=Edit["guild_id"],
                user_id=AuthDiscord.User.user_id,
                msg="changing 'on_server' require server owner")

        update["on_server"] = Edit["on_server"]

    if not update:
        return await cls.Tree.Api.errors.apiMissingData(
            cls, WebRequest, msg="No changes, please add at least one")

    cls.BASE.PhaazeDB.updateQuery(
        table="discord_user",
        content=update,
        where=
        "`discord_user`.`guild_id` = %s AND `discord_user`.`member_id` = %s",
        where_values=(CurrentLevelUser.guild_id, CurrentLevelUser.member_id))

    # logging
    GuildSettings: DiscordServerSettings = await getDiscordSeverSettings(
        PhaazeDiscord, Edit["guild_id"], prevent_new=True)
    log_coro: Coroutine = loggingOnLevelEdit(
        PhaazeDiscord,
        GuildSettings,
        Editor=CheckMember,
        changed_member_id=CurrentLevelUser.member_id,
        changes=update)
    asyncio.ensure_future(log_coro, loop=cls.BASE.DiscordLoop)

    cls.BASE.Logger.debug(
        f"(API/Discord) Level: {Edit['guild_id']=} {Edit['member_id']=} updated",
        require="discord:levels")
    return cls.response(text=json.dumps(
        dict(msg="Level: Updated", changes=update, status=200)),
                        content_type="application/json",
                        status=200)