···33import { guildStore } from "@/common/guilds";
44import Switch from "@/components/inputs/switch";
55import { Section } from "@/components/section";
66+import { GuildFlags } from "@/typings";
77+import { transformer } from "@/utils/bitfields";
68import { useParams } from "next/navigation";
79import { HiChartBar } from "react-icons/hi";
810···1618 const params = useParams();
17191820 return (<>
1919- <OverviewLink
2020- title="View Leaderboard"
2121- message="Easily access and view the top chatters, voice timers, and inviters from this server in the web."
2222- url={`/leaderboard/${params.guildId}`}
2323- icon={<HiChartBar />}
2424- />
2121+ {(guild!.flags & GuildFlags.PrivateLeaderboard) !== 0 && (
2222+ <OverviewLink
2323+ title="View Leaderboard"
2424+ message="Easily access and view the top chatters, voice timers, and inviters from this server in the web."
2525+ url={`/leaderboard/${params.guildId}`}
2626+ icon={<HiChartBar />}
2727+ />
2828+ )}
25292630 <BotStyle />
2731···43474448 <Switch
4549 label="Embed message links"
5050+ description="Reply with the original content of a message if a message link is sent."
4651 endpoint={`/guilds/${params.guildId}`}
4747- k="embedLinks"
4848- description="Reply with the original content of a message if a message link is sent."
4949- defaultState={guild?.embedLinks || false}
5252+ k="flags"
5353+ defaultState={(guild!.flags & GuildFlags.EmbedDiscordLinks) !== 0}
5454+ transform={(value) => transformer(value, guild!.flags, GuildFlags.EmbedDiscordLinks)}
5555+ onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.EmbedDiscordLinks) })}
5056 />
5151-5257 </>);
5358}
+46-43
app/dashboard/[guildId]/starboard/page.tsx
···1212import Notice from "@/components/notice";
1313import { Button } from "@/components/ui/button";
1414import { useApi } from "@/lib/api/hook";
1515-import { type ApiV1GuildsModulesStarboardGetResponse, StarboardStyle } from "@/typings";
1515+import { type ApiV1GuildsModulesStarboardGetResponse, GuildFlags, StarboardStyle } from "@/typings";
1616+import { transformer } from "@/utils/bitfields";
1617import { createSelectableItems } from "@/utils/create-selectable-items";
1718import Image from "next/image";
1819import Link from "next/link";
···27282829 const url = `/guilds/${params.guildId}/modules/starboard` as const;
2930 const { data, isLoading, error, edit } = useApi<ApiV1GuildsModulesStarboardGetResponse>(url);
3131+3232+ const enabled = (guild!.flags & GuildFlags.StarboardEnabled) !== 0;
30333134 const example = useExample(data && !("message" in data)
3235 ? data.style
···5861 </div>
59626063 <Switch
6161- label="Starboard module enabled"
6262- endpoint={url}
6363- k="enabled"
6464- defaultState={data.enabled}
6565- disabled={false}
6666- onSave={(v) => edit("enabled", v)}
6464+ label="Enable Starboard"
6565+ endpoint={`/guilds/${guild?.id}`}
6666+ k="flags"
6767+ defaultState={enabled}
6868+ transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardEnabled)}
6969+ onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardEnabled) })}
6770 />
68716972 <Switch
7073 label="Allow bots, apps and webhooks"
7171- endpoint={url}
7272- k="allowBots"
7373- defaultState={data.allowBots}
7474- disabled={!data.enabled}
7575- onSave={(v) => edit("allowBots", v)}
7474+ endpoint={`/guilds/${guild?.id}`}
7575+ k="flags"
7676+ defaultState={(guild!.flags & GuildFlags.StarboardAllowBots) !== 0}
7777+ transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardAllowBots)}
7878+ onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowBots) })}
7679 />
77807881 <Switch
7982 label="Allow NSFW channels"
8080- endpoint={url}
8181- k="allowNSFW"
8282- defaultState={data.allowNSFW}
8383- disabled={!data.enabled}
8484- onSave={(v) => edit("allowNSFW", v)}
8383+ endpoint={`/guilds/${guild?.id}`}
8484+ k="flags"
8585+ defaultState={(guild!.flags & GuildFlags.StarboardAllowNSFW) !== 0}
8686+ transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardAllowNSFW)}
8787+ onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowNSFW) })}
8588 />
86898790 <Switch
8891 label="Allow message edits"
8992 description="If a message is being edited, update it in the data."
9090- endpoint={url}
9191- k="allowEdits"
9292- defaultState={data.allowEdits}
9393- disabled={!data.enabled}
9494- onSave={(v) => edit("allowEdits", v)}
9393+ endpoint={`/guilds/${guild?.id}`}
9494+ k="flags"
9595+ defaultState={(guild!.flags & GuildFlags.StarboardAllowEdits) !== 0}
9696+ transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardAllowEdits)}
9797+ onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowEdits) })}
9598 />
969997100 <Switch
98101 label="Allow author reaction"
99102 description="Lets the message author star their own messages."
100100- endpoint={url}
101101- k="allowSelfReact"
102102- defaultState={data.allowSelfReact}
103103- disabled={!data.enabled}
104104- onSave={(v) => edit("allowSelfReact", v)}
103103+ endpoint={`/guilds/${guild?.id}`}
104104+ k="flags"
105105+ defaultState={(guild!.flags & GuildFlags.StarboardAllowSelf) !== 0}
106106+ transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardAllowSelf)}
107107+ onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardAllowSelf) })}
105108 />
106109107110 <Switch
108111 label="Display stared message reference"
109112 description="Repost the message reply in the data."
110110- endpoint={url}
111111- k="displayReference"
112112- defaultState={data.displayReference}
113113- disabled={!data.enabled}
114114- onSave={(v) => edit("displayReference", v)}
113113+ endpoint={`/guilds/${guild?.id}`}
114114+ k="flags"
115115+ defaultState={(guild!.flags & GuildFlags.StarboardDisplayReference) !== 0}
116116+ transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardDisplayReference)}
117117+ onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardDisplayReference) })}
115118 />
116119117120 <Switch
118121 label="Delete message from starboard upon losing reactions"
119122 description="If a message in the starboard looses the required reactions, it gets deleted."
120120- endpoint={url}
121121- k="delete"
122122- defaultState={data.delete}
123123- disabled={!data.enabled}
124124- onSave={(v) => edit("delete", v)}
123123+ endpoint={`/guilds/${guild?.id}`}
124124+ k="flags"
125125+ defaultState={(guild!.flags & GuildFlags.StarboardDeleteOnLoss) !== 0}
126126+ transform={(value) => transformer(value, guild!.flags, GuildFlags.StarboardDeleteOnLoss)}
127127+ onSave={(value) => guildStore.setState({ flags: transformer(value, guild!.flags, GuildFlags.StarboardDeleteOnLoss) })}
125128 />
126129127130 <NumberInput
···130133 url={url}
131134 dataName="requiredEmojis"
132135 defaultState={data.requiredEmojis ?? 0}
133133- disabled={!data.enabled}
136136+ disabled={!enabled}
134137 min={2}
135138 onSave={(v) => edit("requiredEmojis", v)}
136139 />
···142145 items={createSelectableItems(guild?.channels)}
143146 description="Select the channel where the starboard messages should be send into."
144147 defaultState={data.channelId}
145145- disabled={!data.enabled}
148148+ disabled={!enabled}
146149 onSave={(o) => edit("channelId", o.value as string)}
147150 />
148151···171174 ]}
172175 description="Select the emoji that needs to be reacted with."
173176 defaultState={data.emoji}
174174- disabled={!data.enabled}
177177+ disabled={!enabled}
175178 onSave={(o) => edit("emoji", o.value as string)}
176179 />
177180 </div>
···204207 ]}
205208 description="The style members profile gets displayed."
206209 defaultState={data.style}
207207- disabled={!data.enabled}
210210+ disabled={!enabled}
208211 onSave={(o) => edit("style", o.value as number)}
209212 />
210213 </div>
···220223 description="Select channels which should not be able to get into the starboard."
221224 defaultState={data.blacklistChannelIds || []}
222225 max={500}
223223- disabled={!data.enabled}
226226+ disabled={!enabled}
224227 onSave={(o) => edit("blacklistChannelIds", o.map(({ value }) => value))}
225228 />
226229 </div>
···233236 description="Select roles which should not be able to star or be starred."
234237 defaultState={data.blacklistRoleIds || []}
235238 max={500}
236236- disabled={!data.enabled}
239239+ disabled={!enabled}
237240 onSave={(o) => edit("blacklistChannelIds", o.map(({ value }) => value))}
238241 />
239242 </div>
···49495050**Note:** This requires the failed verification action to be set to "Assign role to member".
51515252-### 💬 Send direct message to member on fail
5353-If the member should recieve a DM if they failed verification, along with the following punishment (eg.: a ban).
5454-5552## Permissions
5653Here is a quick reference on how permissions should be setup so everything works as expected.
5754···6663<br />
67646865Once people have failed verification due to any reason, they will not be able to verify again at any time, and manual approval by server moderators or admins is required. Wamellow developers cannot verify or punish members in any server.
6666+<br />
6767+<br />
6868+6969+The user will be sent a direct message when they fail verification containing the reason for the failure and the punishment taken.
69707071## Troubleshooting
7172If you joined a server, received a Direct Message (DM) from Wamellow, clicked on "Start Verification", and now receive the error message "**You are not a member of this guild**", please make sure that you are logged in with the same Discord account in your browser as you are in the Discord application. Should you be logged in with the wrong account, click on your username in the top right corner and click the `->` (red logout) button.