Skip to content

Commit 4251eae

Browse files
added more apis
1 parent a0f6f65 commit 4251eae

6 files changed

Lines changed: 183 additions & 12 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "openblox",
33
"description": "Roblox API Wrapper For Both Classic And OpenCloud APIs.",
44
"type": "commonjs",
5-
"version": "1.0.60",
5+
"version": "1.0.62",
66
"license": "MIT",
77
"bugs": {
88
"url": "https://github.com/MightyPart/openblox/issues"

src/apis/classic/friends/friends.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,7 @@ export const userFollowersCount = createApiMethod(async (
443443
}))
444444

445445

446+
// TODO: finish this endpoint.
446447
/**
447448
* Gets the followings for a specific user.
448449
* @endpoint REST /...

src/apis/classic/groups/groups.ts

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { readFile } from "../../../file"
99
import type { Identifier, UnionToArray, ArrayNonEmptyIfConst } from "typeforge"
1010

1111
import type { ApiMethod } from "../../apiGroup"
12-
import type { AddGroupSocialLinkData, AuthenticatedUserGroupMembershipInfoData, FormattedAllGroupRolesForUserData_V1, GroupAuditLogActionType, GroupPayoutRestrictionsInfoData, GroupRelationshipType, GroupRolePermissions, GroupRolePermissionsData, GroupsConfigMetadataData, GroupSettingsData, GroupsMetadataData, NewSocialLinkRequest, PrettifiedAllGroupRolesForUserData_V2, PrettifiedAllRolesForGroupData, PrettifiedAuthenticatedUserPendingGroupsData, PrettifiedGroupAuditLogsData, PrettifiedGroupIdsToGroupsInfoData, PrettifiedGroupInfoData, PrettifiedGroupJoinRequestForUser, PrettifiedGroupJoinRequests, PrettifiedGroupLookupSearch, PrettifiedGroupMembersData, PrettifiedGroupMembersWithRoleData, PrettifiedGroupNameHistoryData, PrettifiedGroupPayoutsInfoData, PrettifiedGroupPermissionsForAllRoles, PrettifiedGroupPolicyInfoData, PrettifiedGroupRelationshipsData, PrettifiedGroupRolesFromIdsData, PrettifiedGroupSearchData, PrettifiedGroupSearchMetadata, PrettifiedGroupShoutData, PrettifiedGroupSocialLinksData, PrettifiedGroupsThatUsersFriendsAreInData, PrettifiedGroupWallPostsData_V1, PrettifiedGroupWallPostsData_V2, PrettifiedPrimaryGroupForUserData, RawAllGroupRolesForUserData_V1, RawAllGroupRolesForUserData_V2, RawAllRolesForGroupData, RawAuthenticatedUserPendingGroupsData, RawGroupAuditLogsData, RawGroupIdsToGroupsInfoData, RawGroupInfoData, RawGroupJoinRequestForUser, RawGroupJoinRequests, RawGroupLookupSearch, RawGroupMembersData, RawGroupMembersWithRoleData, RawGroupNameHistoryData, RawGroupPayoutsInfoData, RawGroupPermissionsForAllRoles, RawGroupPolicyInfoData, RawGroupRelationshipsData, RawGroupRolesFromIdsData, RawGroupSearchData, RawGroupSearchMetadata, RawGroupShoutData, RawGroupSocialLinksData, RawGroupsThatUsersFriendsAreInData, RawGroupWallPostsData_V1, RawGroupWallPostsData_V2, RawPrimaryGroupForUserData, UpdateRoleSetData, UpdateRoleSetRequest } from "./groups.types"
12+
import type { AddGroupSocialLinkData, AuthenticatedUserGroupMembershipInfoData, BanGroupMemberData, FormattedAllGroupRolesForUserData_V1, GroupAuditLogActionType, GroupPayoutRestrictionsInfoData, GroupRelationshipType, GroupRolePermissions, GroupRolePermissionsData, GroupsConfigMetadataData, GroupSettingsData, GroupsMetadataData, NewSocialLinkRequest, PrettifiedAllGroupRolesForUserData_V2, PrettifiedAllRolesForGroupData, PrettifiedAuthenticatedUserPendingGroupsData, PrettifiedGroupAuditLogsData, PrettifiedGroupBansData, PrettifiedGroupIdsToGroupsInfoData, PrettifiedGroupInfoData, PrettifiedGroupJoinRequestForUser, PrettifiedGroupJoinRequests, PrettifiedGroupLookupSearch, PrettifiedGroupMembersData, PrettifiedGroupMembersWithRoleData, PrettifiedGroupNameHistoryData, PrettifiedGroupPayoutsInfoData, PrettifiedGroupPermissionsForAllRoles, PrettifiedGroupPolicyInfoData, PrettifiedGroupRelationshipsData, PrettifiedGroupRolesFromIdsData, PrettifiedGroupSearchData, PrettifiedGroupSearchMetadata, PrettifiedGroupShoutData, PrettifiedGroupSocialLinksData, PrettifiedGroupsThatUsersFriendsAreInData, PrettifiedGroupWallPostsData_V1, PrettifiedGroupWallPostsData_V2, PrettifiedPrimaryGroupForUserData, RawAllGroupRolesForUserData_V1, RawAllGroupRolesForUserData_V2, RawAllRolesForGroupData, RawAuthenticatedUserPendingGroupsData, RawGroupAuditLogsData, RawGroupBansData, RawGroupIdsToGroupsInfoData, RawGroupInfoData, RawGroupJoinRequestForUser, RawGroupJoinRequests, RawGroupLookupSearch, RawGroupMembersData, RawGroupMembersWithRoleData, RawGroupNameHistoryData, RawGroupPayoutsInfoData, RawGroupPermissionsForAllRoles, RawGroupPolicyInfoData, RawGroupRelationshipsData, RawGroupRolesFromIdsData, RawGroupSearchData, RawGroupSearchMetadata, RawGroupShoutData, RawGroupSocialLinksData, RawGroupsThatUsersFriendsAreInData, RawGroupWallPostsData_V1, RawGroupWallPostsData_V2, RawPrimaryGroupForUserData, UpdateRoleSetData, UpdateRoleSetRequest } from "./groups.types"
1313
import type { SortOrder } from "../../../utils/utils.types"
1414
//////////////////////////////////////////////////////////////////////////////////
1515

@@ -1621,4 +1621,75 @@ export const groupWallPosts_V2 = createApiMethod(async (
16211621
wallPost.updated = new Date(wallPost.updated)
16221622
}))
16231623
}))
1624+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1625+
1626+
1627+
// [ BANS ] //////////////////////////////////////////////////////////////////////////////////////////////////////////
1628+
/**
1629+
* Gets a list of group bans.
1630+
* @category Bans
1631+
* @endpoint GET /v1/groups/{groupId}/bans
1632+
*
1633+
* @param groupId The id of the group to get bans for.
1634+
* @param limit The number of results to be returned.
1635+
* @param sortOrder The order that the results are sorted in.
1636+
* @param cursor The paging cursor for the previous or next page.
1637+
*
1638+
* @example const { data:bans } = await ClassicGroupsApi.groupBans({ groupId: 5850082 })
1639+
* @exampleData [{"user":{"hasVerifiedBadge":false,"userId":1599940985,"username":"TheNamelessBot","displayName":"TheNamelessBot"},"actingUser":{"user":{"hasVerifiedBadge":false,"userId":45348281,"username":"MightyPart","displayName":"Mighty"},"role":{"id":38353811,"name":"NamelessGuy2005 - Scriptor","rank":255}},"created":"2025-05-17T17:04:15.646Z"}]
1640+
* @exampleRawBody {"previousPageCursor":null,"nextPageCursor":null,"data":[{"user":{"hasVerifiedBadge":false,"userId":1599940985,"username":"TheNamelessBot","displayName":"TheNamelessBot"},"actingUser":{"user":{"hasVerifiedBadge":false,"userId":45348281,"username":"MightyPart","displayName":"Mighty"},"role":{"id":38353811,"name":"NamelessGuy2005 - Scriptor","rank":255}},"created":"2025-05-17T17:04:15.646Z"}]}
1641+
*/
1642+
export const groupBans = createApiMethod(async (
1643+
{ groupId, limit, sortOrder, cursor }:
1644+
{ groupId: Identifier, limit?: number, sortOrder?: "Asc" | "Desc", cursor?: string }
1645+
): ApiMethod<RawGroupBansData, PrettifiedGroupBansData> => ({
1646+
method: "GET",
1647+
path: `/v1/groups/${groupId}/bans`,
1648+
searchParams: { limit, sortOrder, cursor },
1649+
name: "groupBans",
1650+
1651+
formatRawDataFn: ({ data }) => data
1652+
}))
1653+
1654+
/**
1655+
* Bans a member from a group.
1656+
* @category Bans
1657+
* @endpoint POST /v1/groups/{groupId}/bans/{userId}
1658+
*
1659+
* @param groupId The id of the group to ban a member from.
1660+
* @param userId The id of the member to ban.
1661+
*
1662+
* @example const { data:banInfo } = await ClassicGroupsApi.banGroupMember({ groupId: 5850082, userId: 1599940985 })
1663+
* @exampleData {"user":{"hasVerifiedBadge":false,"userId":1599940985,"username":"TheNamelessBot","displayName":"TheNamelessBot"},"actingUser":{"user":{"hasVerifiedBadge":false,"userId":45348281,"username":"MightyPart","displayName":"Mighty"},"role":{"id":38353811,"name":"NamelessGuy2005 - Scriptor","rank":255}},"created":"2025-05-17T17:04:15.646Z"}
1664+
* @exampleRawBody {"user":{"hasVerifiedBadge":false,"userId":1599940985,"username":"TheNamelessBot","displayName":"TheNamelessBot"},"actingUser":{"user":{"hasVerifiedBadge":false,"userId":45348281,"username":"MightyPart","displayName":"Mighty"},"role":{"id":38353811,"name":"NamelessGuy2005 - Scriptor","rank":255}},"created":"2025-05-17T17:04:15.646Z"}
1665+
*/
1666+
export const banGroupMember = createApiMethod(async <UserId extends Identifier>(
1667+
{ groupId, userId }: { groupId: Identifier, userId: UserId }
1668+
): ApiMethod<BanGroupMemberData<UserId>> => ({
1669+
method: "POST",
1670+
path: `/v1/groups/${groupId}/bans/${userId}`,
1671+
name: "banGroupMember"
1672+
}))
1673+
1674+
/**
1675+
* Unbans a member from a group.
1676+
* @category Bans
1677+
* @endpoint DELETE /v1/groups/{groupId}/bans/{userId}
1678+
*
1679+
* @param groupId The id of the group to unban a member from.
1680+
* @param userId The id of the member to unban.
1681+
*
1682+
* @example const { data:success } = await ClassicGroupsApi.unbanGroupMember({ groupId: 5850082, userId: 1599940985 })
1683+
* @exampleData true
1684+
* @exampleRawBody {}
1685+
*/
1686+
export const unbanGroupMember = createApiMethod(async <UserId extends Identifier>(
1687+
{ groupId, userId }: { groupId: Identifier, userId: UserId }
1688+
): ApiMethod<boolean, {}> => ({
1689+
method: "DELETE",
1690+
path: `/v1/groups/${groupId}/bans/${userId}`,
1691+
name: "unbanGroupMember",
1692+
1693+
formatRawDataFn: dataIsSuccess
1694+
}))
16241695
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

src/apis/classic/groups/groups.types.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,4 +1135,40 @@ export type RawGroupWallPostsData_V2 = ObjectPrettify<{
11351135
}>
11361136

11371137
export type PrettifiedGroupWallPostsData_V2 = GroupWallPostsData_V2<Date>
1138+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1139+
1140+
1141+
// [ BANS ] //////////////////////////////////////////////////////////////////////////////////////////////////////////
1142+
export type BanGroupMemberData<UserId extends Identifier> = {
1143+
user: {
1144+
hasVerifiedBadge: boolean,
1145+
userId: UserId,
1146+
username: string,
1147+
displayName: string
1148+
},
1149+
actingUser: {
1150+
user: {
1151+
hasVerifiedBadge: boolean,
1152+
userId: Identifier,
1153+
username: string,
1154+
displayName: string
1155+
},
1156+
role: {
1157+
id: Identifier,
1158+
name: string,
1159+
rank: number
1160+
}
1161+
},
1162+
created: ISODateTime
1163+
}
1164+
1165+
// GET /v1/groups/{groupId}/bans -------------------------------------------------------------------------------------
1166+
export type RawGroupBansData = {
1167+
previousPageCursor?: string,
1168+
nextPageCursor?: string,
1169+
data: BanGroupMemberData<Identifier>[]
1170+
}
1171+
1172+
export type PrettifiedGroupBansData = BanGroupMemberData<Identifier>[]
1173+
// -------------------------------------------------------------------------------------------------------------------
11381174
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

src/apis/cloud/groups/groups.ts

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import { cloneAndMutateObject, dataIsSuccess } from "../../../utils/utils"
55

66

77
// [ Types ] /////////////////////////////////////////////////////////////////////
8-
import type { ArrayToUnion, Identifier, ObjectPrettify } from "typeforge"
8+
import type { ArrayToUnion, Identifier, ISODateTime, ObjectPrettify } from "typeforge"
99

1010
import type { ApiMethod } from "../../apiGroup"
11-
import type { GroupMembers_Filter, GroupMembers_WildcardFilter, PrettifiedGroupInfoData, PrettifiedGroupJoinRequestsData, PrettifiedGroupMembersData, PrettifiedGroupRolesData, PrettifiedGroupShoutData, RawGroupInfoData, RawGroupJoinRequestsData, RawGroupMembersData, RawGroupRolesData, RawGroupShoutData } from "./groups.types"
11+
import type { GroupMembers_Filter, GroupMembers_WildcardFilter, GroupRole, PrettifiedGroupInfoData, PrettifiedGroupJoinRequestsData, PrettifiedGroupMembersData, PrettifiedGroupRolesData, PrettifiedGroupShoutData, RawGroupInfoData, RawGroupJoinRequestsData, RawGroupMembersData, RawGroupRolesData, RawGroupShoutData, UpdateGroupMemberRoleData } from "./groups.types"
1212
//////////////////////////////////////////////////////////////////////////////////
1313

1414

@@ -146,6 +146,27 @@ export const groupRoles = createApiMethod(async <GroupId extends Identifier>(
146146
}))
147147

148148

149+
/**
150+
* Gets information about a specific role for a group.
151+
* @endpoint GET /v2/groups/{groupId}/roles/{roleId}
152+
*
153+
* @param groupId The id of the group to get the role information from.
154+
* @param roleId The id of the role to get information about.
155+
*
156+
* @example const { data:role } = await GroupsApi.groupRole({ groupId: 5850082, roleId: 48715304 })
157+
* @exampleData
158+
* @exampleRawBody
159+
*/
160+
export const groupRole = createApiMethod(async <GroupId extends Identifier, RoleId extends Identifier>(
161+
{ groupId, roleId }:
162+
{ groupId: GroupId, roleId: RoleId }
163+
): ApiMethod<GroupRole<GroupId, RoleId, ISODateTime>> => ({
164+
path: `/v2/groups/${groupId}/roles/${roleId}`,
165+
method: "GET",
166+
name: "groupRole",
167+
}))
168+
169+
149170
/**
150171
* Gets roles for a group.
151172
* @endpoint GET /v2/groups/{groupId}/roles
@@ -245,4 +266,28 @@ export const declineGroupJoinRequest = createApiMethod(async (
245266
name: "declineGroupJoinRequest",
246267

247268
formatRawDataFn: (rawData) => dataIsSuccess(rawData)
269+
}))
270+
271+
272+
/**
273+
* Updates the group membership for a particular group member. This action requires the requester to be able to manage lower ranked members. Guest or Owner ranks cannot be assigned, and a requester cannot change their own rank.
274+
* @endpoint PATCH /v2/groups/{groupId}/memberships/{userId}
275+
*
276+
* @param groupId The id of the group to change a users role for.
277+
* @param userId The id of the user to change role for.
278+
* @param roleId The id of the role to update to.
279+
*
280+
* @example const { data:success } = await GroupsApi.updateGroupMemberRole({ groupId: 5850082, userId: 2655994471, roleId: 41112469 });
281+
* @exampleData {"path":"groups/5850082/memberships/MTU5OTk0MDk4NQ","createTime":"2020-04-30T10:28:57.147Z","updateTime":"2025-05-17T16:26:10.879549500Z","user":"users/1599940985","role":"groups/5850082/roles/41112469"}
282+
* @exampleRawBody {"path":"groups/5850082/memberships/MTU5OTk0MDk4NQ","createTime":"2020-04-30T10:28:57.147Z","updateTime":"2025-05-17T16:26:10.879549500Z","user":"users/1599940985","role":"groups/5850082/roles/41112469"}
283+
*/
284+
export const updateGroupMemberRole = createApiMethod(async <GroupId extends Identifier, RoleId extends Identifier>(
285+
{ groupId, userId, roleId }: { groupId: GroupId, userId: Identifier, roleId: RoleId }
286+
): ApiMethod<UpdateGroupMemberRoleData<GroupId, RoleId>> => ({
287+
method: "PATCH",
288+
path: `/v2/groups/${groupId}/memberships/${userId}`,
289+
body: {
290+
role: `groups/${groupId}/roles/${roleId}`
291+
},
292+
name: "declineGroupJoinRequest"
248293
}))

src/apis/cloud/groups/groups.types.ts

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,20 @@ export type PrettifiedGroupMembersData<
7474

7575

7676
// GET /v2/groups/${groupId}/roles -----------------------------------------------------------------------------------
77-
type GroupRole<GroupId extends Identifier, TemporalType> = ObjectPrettify<{
78-
path: `groups/${GroupId}/roles/${Identifier}`,
77+
export type GroupRole<
78+
GroupId extends Identifier,
79+
RoleId extends Identifier,
80+
TemporalType
81+
> = ObjectPrettify<{
82+
path: `groups/${GroupId}/roles/${RoleId}`,
7983
createTime: TemporalType,
8084
updateTime: TemporalType,
81-
id: Identifier,
85+
id: RoleId,
8286
displayName: string,
8387
description: string,
8488
rank: number,
85-
memberCount: number,
86-
permissions: {
89+
memberCount?: number,
90+
permissions?: {
8791
viewWallPosts: boolean,
8892
createWallPosts: boolean,
8993
deleteWallPosts: boolean,
@@ -106,11 +110,11 @@ type GroupRole<GroupId extends Identifier, TemporalType> = ObjectPrettify<{
106110
}>
107111

108112
export type RawGroupRolesData<GroupId extends Identifier> = {
109-
groupRoles: GroupRole<GroupId, ISODateTime>[]
113+
groupRoles: GroupRole<GroupId, Identifier, ISODateTime>[]
110114
nextPageToken: string
111115
}
112116

113-
export type PrettifiedGroupRolesData<GroupId extends Identifier> = GroupRole<GroupId, Date>[]
117+
export type PrettifiedGroupRolesData<GroupId extends Identifier> = GroupRole<GroupId, Identifier, Date>[]
114118
// -------------------------------------------------------------------------------------------------------------------
115119

116120

@@ -126,4 +130,18 @@ type GroupShoutData<GroupId extends Identifier, TemporalType> = {
126130
export type RawGroupShoutData<GroupId extends Identifier> = GroupShoutData<GroupId, ISODateTime>
127131

128132
export type PrettifiedGroupShoutData<GroupId extends Identifier> = GroupShoutData<GroupId, Date>
129-
// -------------------------------------------------------------------------------------------------------------------
133+
// -------------------------------------------------------------------------------------------------------------------
134+
135+
// PATCH /v2/groups/{groupId}/memberships/{userId} -------------------------------------------------------------------
136+
export type UpdateGroupMemberRoleData<
137+
GroupId extends Identifier,
138+
RoleId extends Identifier
139+
> = {
140+
path: `groups/${GroupId}/memberships/${string}`,
141+
createTime: ISODateTime,
142+
updateTime: ISODateTime,
143+
user: `users/${Identifier}`,
144+
role: `groups/${GroupId}/roles/${RoleId}`,
145+
}
146+
// -------------------------------------------------------------------------------------------------------------------
147+

0 commit comments

Comments
 (0)