Skip to content

Commit 24ac1de

Browse files
Merge pull request #62 from Real-Dev-Squad/develop
Updated group roles
2 parents e1d6387 + 05c1c72 commit 24ac1de

16 files changed

+370
-5
lines changed

.github/workflows/register-commands-production.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@ jobs:
3131
DISCORD_GUILD_ID
3232
CURRENT_ENVIRONMENT
3333
BOT_PRIVATE_KEY
34+
RDS_SERVERLESS_PUBLIC_KEY
3435
env:
3536
CURRENT_ENVIRONMENT: production
3637
CLOUDFLARE_API_TOKEN: ${{secrets.CLOUDFLARE_API_TOKEN}}
3738
DISCORD_PUBLIC_KEY: ${{secrets.DISCORD_PUBLIC_KEY}}
3839
DISCORD_TOKEN: ${{secrets.DISCORD_TOKEN}}
3940
BOT_PRIVATE_KEY: ${{secrets.BOT_PRIVATE_KEY}}
4041
DISCORD_GUILD_ID: ${{secrets.DISCORD_GUILD_ID}}
42+
RDS_SERVERLESS_PUBLIC_KEY: ${{secrets.RDS_SERVERLESS_PUBLIC_KEY}}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@
3535
"wrangler": "^2.5.0"
3636
},
3737
"dependencies": {
38+
"dotenv": "^16.0.3",
3839
"@tsndr/cloudflare-worker-jwt": "^2.2.1",
3940
"discord-interactions": "^3.2.0",
40-
"dotenv": "^16.0.3",
4141
"itty-router": "^3.0.11",
4242
"node-fetch": "^3.3.0"
4343
},

src/constants/responses.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,5 @@ export const INTERNAL_SERVER_ERROR =
2121

2222
export const RETRY_COMMAND =
2323
"Oops, we didn't catch that! Please use the command again.";
24+
25+
export const ROLE_ADDED = "Role added successfully";

src/constants/urls.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export const RDS_BASE_API_URL = "https://api.realdevsquad.com";
22
export const RDS_BASE_STAGING_API_URL = "https://staging-api.realdevsquad.com";
3-
export const RDS_BASE_DEVELOPMENT_API_URL = "http://localhost:3000"; // If needed, modify the URL to your local API server
3+
export const RDS_BASE_DEVELOPMENT_API_URL = "YOUR_LOCAL_API_URL"; // If needed, modify the URL to your local API server
44

55
export const DISCORD_BASE_URL = "https://discord.com/api/v10";
66
export const DISCORD_AVATAR_BASE_URL = "https://cdn.discordapp.com/avatars";
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { IRequest } from "itty-router";
2+
import jwt from "@tsndr/cloudflare-worker-jwt";
3+
import * as response from "../constants/responses";
4+
import { env } from "../typeDefinitions/default.types";
5+
import JSONResponse from "../utils/JsonResponse";
6+
import { User } from "../typeDefinitions/user.types";
7+
import { getMembersInServer } from "../utils/getMembersInServer";
8+
9+
export const getMembersInServerHandler = async (
10+
request: IRequest,
11+
env: env
12+
) => {
13+
const authHeader = request.headers.get("Authorization");
14+
15+
if (!authHeader) {
16+
return new JSONResponse(response.BAD_SIGNATURE);
17+
}
18+
try {
19+
const authToken = authHeader.split(" ")[1];
20+
await jwt.verify(authToken, env.RDS_SERVERLESS_PUBLIC_KEY, {
21+
algorithm: "RS256",
22+
});
23+
24+
const users = (await getMembersInServer(env)) as User[];
25+
26+
return new JSONResponse(users);
27+
} catch (err) {
28+
return new JSONResponse(response.BAD_SIGNATURE);
29+
}
30+
};
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import * as response from "../constants/responses";
2+
import { env } from "../typeDefinitions/default.types";
3+
import JSONResponse from "../utils/JsonResponse";
4+
import { IRequest } from "itty-router";
5+
import { addGroupRole, createGuildRole } from "../utils/guildRole";
6+
import {
7+
createNewRole,
8+
memberGroupRole,
9+
} from "../typeDefinitions/discordMessage.types";
10+
import { verifyAuthToken } from "../utils/verifyAuthToken";
11+
12+
export async function createGuildRoleHandler(request: IRequest, env: env) {
13+
const authHeader = request.headers.get("Authorization");
14+
if (!authHeader) {
15+
return new JSONResponse(response.BAD_SIGNATURE);
16+
}
17+
try {
18+
await verifyAuthToken(authHeader, env);
19+
const body: createNewRole = await request.json();
20+
21+
const res = await createGuildRole(body, env);
22+
return new JSONResponse(res);
23+
} catch (err) {
24+
return new JSONResponse(response.BAD_SIGNATURE);
25+
}
26+
}
27+
export async function addGroupRoleHandler(request: IRequest, env: env) {
28+
const authHeader = request.headers.get("Authorization");
29+
if (!authHeader) {
30+
return new JSONResponse(response.BAD_SIGNATURE);
31+
}
32+
try {
33+
await verifyAuthToken(authHeader, env);
34+
const body: memberGroupRole = await request.json();
35+
36+
const res = await addGroupRole(body, env);
37+
return new JSONResponse(res);
38+
} catch (err) {
39+
return new JSONResponse(response.BAD_SIGNATURE);
40+
}
41+
}

src/index.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import { env } from "./typeDefinitions/default.types";
66
import { discordMessageRequest } from "./typeDefinitions/discordMessage.types";
77
import JSONResponse from "./utils/JsonResponse";
88
import { verifyBot } from "./utils/verifyBot";
9+
import {
10+
addGroupRoleHandler,
11+
createGuildRoleHandler,
12+
} from "./controllers/guildRoleHandler";
13+
import { getMembersInServerHandler } from "./controllers/getMembersInServer";
914

1015
const router = Router();
1116

@@ -15,6 +20,12 @@ router.get("/", async () => {
1520
});
1621
});
1722

23+
router.put("/roles/create", createGuildRoleHandler);
24+
25+
router.put("/roles/add", addGroupRoleHandler);
26+
27+
router.get("/discord-members", getMembersInServerHandler);
28+
1829
router.post("/", async (request, env) => {
1930
const message: discordMessageRequest = await request.json();
2031
if (message.type === InteractionType.PING) {

src/typeDefinitions/discordMessage.types.d.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,25 @@ export interface messageMember {
3030
export interface createDmChannel {
3131
id: number;
3232
}
33+
export interface createNewRole {
34+
rolename: string;
35+
mentionable: boolean;
36+
}
37+
export interface memberGroupRole {
38+
userid: string;
39+
roleid: string;
40+
}
41+
42+
export interface guildRoleResponse {
43+
id: string;
44+
name: string;
45+
color: number;
46+
hoist: boolean;
47+
icon?: string;
48+
unicode_emoji?: string;
49+
position: number;
50+
permissions: string;
51+
managed: boolean;
52+
mentionable: boolean;
53+
tags?: object;
54+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
export interface User {
2+
avatar: null | string;
3+
communication_disabled_until: null | string;
4+
flags: 0;
5+
is_pending: boolean;
6+
joined_at: string; //ISO8601 timestamp
7+
nick: null | string;
8+
pending: boolean;
9+
premium_since: null | string;
10+
roles: string[];
11+
user: {
12+
id: string;
13+
username: string;
14+
global_name: string;
15+
display_name: string;
16+
avatar: string; // avatar hash
17+
discriminator: string; //4-digit discord-tag
18+
public_flags: integer;
19+
avatar_decoration: null;
20+
};
21+
mute: boolean;
22+
deaf: boolean;
23+
}

src/utils/getMembersInServer.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import * as response from "../constants/responses";
2+
import { env } from "../typeDefinitions/default.types";
3+
import { DISCORD_BASE_URL } from "../constants/urls";
4+
5+
export const getMembersInServer = async (env: env) => {
6+
try {
7+
const MEMBERS_URL = `${DISCORD_BASE_URL}/guilds/${env.DISCORD_GUILD_ID}/members?limit=1000`;
8+
const response = await fetch(MEMBERS_URL, {
9+
method: "GET",
10+
headers: {
11+
"Content-Type": "application/json",
12+
Authorization: `Bot ${env.DISCORD_TOKEN}`,
13+
},
14+
});
15+
return response.json();
16+
} catch (err) {
17+
return response.BAD_SIGNATURE;
18+
}
19+
};

0 commit comments

Comments
 (0)