Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/toolkits/toolkits/discord/base.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import { z } from "zod";

import { DiscordTools, listServersTool, getUserInfoTool } from "./tools";
import {
DiscordTools,
listServersTool,
getUserInfoTool,
getGuildMemberTool,
} from "./tools";

import type { ToolkitConfig } from "@/toolkits/types";

Expand All @@ -15,6 +20,7 @@ export const baseDiscordToolkitConfig: ToolkitConfig<
tools: {
[DiscordTools.ListServers]: listServersTool,
[DiscordTools.GetUserInfo]: getUserInfoTool,
[DiscordTools.GetGuildMember]: getGuildMemberTool,
},
parameters: discordParameters,
};
2 changes: 2 additions & 0 deletions src/toolkits/toolkits/discord/client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { DiscordTools } from "./tools";
import {
listServersToolConfigClient,
getUserInfoToolConfigClient,
getGuildMemberToolConfigClient,
} from "./tools/client";

import { Link } from "../components/link";
Expand Down Expand Up @@ -40,5 +41,6 @@ export const discordClientToolkit = createClientToolkit(
{
[DiscordTools.ListServers]: listServersToolConfigClient,
[DiscordTools.GetUserInfo]: getUserInfoToolConfigClient,
[DiscordTools.GetGuildMember]: getGuildMemberToolConfigClient,
},
);
6 changes: 5 additions & 1 deletion src/toolkits/toolkits/discord/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { DiscordTools } from "./tools";
import {
listServersToolConfigServer,
getUserInfoToolConfigServer,
getGuildMemberToolConfigServer,
} from "./tools/server";

import { api } from "@/trpc/server";
Expand All @@ -17,10 +18,12 @@ export const discordToolkitServer = createServerToolkit(

- **List Servers**: Get a list of all Discord servers you are a member of
- **Get User Info**: Retrieve information about your Discord account
- **Get Guild Member**: Retrieve your member profile, roles, and join date for a specific Discord server

**Tool Sequencing Strategies:**
1. **Server Discovery**: Start with List Servers to see all your servers
2. **Profile Analysis**: Use Get User Info to understand your account status and permissions
2. **Server Membership Details**: Use Get Guild Member with a server ID from List Servers to inspect your server-specific member profile
3. **Profile Analysis**: Use Get User Info to understand your account status and permissions

**Best Practices:**
- Use List Servers to understand your server landscape
Expand All @@ -46,6 +49,7 @@ export const discordToolkitServer = createServerToolkit(
return {
[DiscordTools.ListServers]: listServersToolConfigServer(rest),
[DiscordTools.GetUserInfo]: getUserInfoToolConfigServer(rest),
[DiscordTools.GetGuildMember]: getGuildMemberToolConfigServer(rest),
};
},
);
1 change: 1 addition & 0 deletions src/toolkits/toolkits/discord/tools/client.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from "./list-servers/client";
export * from "./get-user-info/client";
export * from "./get-guild-member/client";
16 changes: 16 additions & 0 deletions src/toolkits/toolkits/discord/tools/get-guild-member/base.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { z } from "zod";

import { createBaseTool } from "@/toolkits/create-tool";

import type { RESTGetCurrentUserGuildMemberResult } from "discord-api-types/v10";

export const getGuildMemberTool = createBaseTool({
description:
"Get your Discord member profile for a specific server by guild ID",
inputSchema: z.object({
guildId: z.string().describe("Discord server/guild ID"),
}),
outputSchema: z.object({
member: z.custom<RESTGetCurrentUserGuildMemberResult>(),
}),
});
45 changes: 45 additions & 0 deletions src/toolkits/toolkits/discord/tools/get-guild-member/client.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import React from "react";
import { createClientTool } from "@/toolkits/create-tool";
import { BadgeCheck, CalendarDays, Shield } from "lucide-react";

import { getGuildMemberTool } from "./base";

export const getGuildMemberToolConfigClient = createClientTool(
getGuildMemberTool,
{
CallComponent: ({ args }) => (
<h3 className="mb-2 font-semibold">
Getting Discord member info for {args.guildId ?? "..."}
</h3>
),
ResultComponent: ({ result: { member } }) => (
<div>
<h3 className="mb-2 font-semibold">Discord Server Membership</h3>
<div className="space-y-2 text-sm">
<div className="flex items-center gap-2">
<BadgeCheck className="size-4" />
<span className="font-medium">
{member.nick ?? member.user?.username ?? "Member"}
</span>
</div>
<div className="flex items-center gap-2 text-gray-600">
<CalendarDays className="size-4" />
<span>
Joined {new Date(member.joined_at).toLocaleDateString()}
</span>
</div>
<div className="flex items-center gap-2 text-gray-600">
<Shield className="size-4" />
<span>{member.roles.length} roles</span>
</div>
{member.premium_since && (
<div className="text-gray-600">
Boosting since{" "}
{new Date(member.premium_since).toLocaleDateString()}
</div>
)}
</div>
</div>
),
},
);
24 changes: 24 additions & 0 deletions src/toolkits/toolkits/discord/tools/get-guild-member/server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Routes } from "discord-api-types/v10";

import { type getGuildMemberTool } from "./base";

import type { ServerToolConfig } from "@/toolkits/types";
import type { RESTGetCurrentUserGuildMemberResult } from "discord-api-types/v10";
import type { REST } from "@discordjs/rest";

export const getGuildMemberToolConfigServer = (
rest: REST,
): ServerToolConfig<
typeof getGuildMemberTool.inputSchema.shape,
typeof getGuildMemberTool.outputSchema.shape
> => {
return {
callback: async ({ guildId }) => {
return {
member: (await rest.get(
Routes.userGuildMember(guildId),
)) as RESTGetCurrentUserGuildMemberResult,
};
},
};
};
2 changes: 2 additions & 0 deletions src/toolkits/toolkits/discord/tools/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
export enum DiscordTools {
ListServers = "list-servers",
GetUserInfo = "get-user-info",
GetGuildMember = "get-guild-member",
}

export * from "./list-servers/base";
export * from "./get-user-info/base";
export * from "./get-guild-member/base";
1 change: 1 addition & 0 deletions src/toolkits/toolkits/discord/tools/server.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from "./list-servers/server";
export * from "./get-user-info/server";
export * from "./get-guild-member/server";
2 changes: 1 addition & 1 deletion src/toolkits/toolkits/discord/wrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
import type { ClientToolkitWrapper } from "@/toolkits/types";
import { Toolkits } from "../shared";

const scopes = ["identify", "guilds", "email"];
const scopes = ["identify", "guilds", "guilds.members.read", "email"];

export const DiscordWrapper: ClientToolkitWrapper = ({ Item }) => {
const { data: account, isLoading } =
Expand Down