Add pronouns for users (#2688)

Co-authored-by: Kalle <38327916+Sendouc@users.noreply.github.com>
This commit is contained in:
hfcRed 2026-01-02 17:34:32 +01:00 committed by GitHub
parent 789b0f5a81
commit 91e26948b2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
46 changed files with 358 additions and 18 deletions

View File

@ -846,6 +846,14 @@ export interface UserPreferences {
clockFormat?: "24h" | "12h" | "auto";
}
export const SUBJECT_PRONOUNS = ["he", "she", "they", "it", "any"] as const;
export const OBJECT_PRONOUNS = ["him", "her", "them", "its", "all"] as const;
export type Pronouns = {
subject: (typeof SUBJECT_PRONOUNS)[number];
object: (typeof OBJECT_PRONOUNS)[number];
};
export interface User {
/** 1 = permabanned, timestamp = ban active till then */
banned: Generated<number | null>;
@ -874,6 +882,7 @@ export interface User {
isApiAccesser: Generated<DBBoolean | null>;
languages: string | null;
motionSens: number | null;
pronouns: JSONColumnTypeNullable<Pronouns>;
patronSince: number | null;
patronTier: number | null;
patronTill: number | null;

View File

@ -47,6 +47,7 @@ export const loader = async ({ params, request }: LoaderFunctionArgs) => {
"User.id",
"User.discordId",
"User.username",
"User.pronouns",
"TournamentOrganizationMember.role",
"TournamentOrganizationMember.roleDisplayName",
])
@ -68,6 +69,7 @@ export const loader = async ({ params, request }: LoaderFunctionArgs) => {
userId: member.id,
discordId: member.discordId,
name: member.username,
pronouns: member.pronouns,
role: member.role,
roleDisplayName: member.roleDisplayName,
})),

View File

@ -90,6 +90,7 @@ export const loader = async ({ params, request }: LoaderFunctionArgs) => {
"User.discordAvatar",
"User.battlefy",
"User.country",
"User.pronouns",
"TournamentTeamMember.inGameName",
"TournamentTeamMember.isOwner",
"TournamentTeamMember.createdAt",
@ -148,6 +149,7 @@ export const loader = async ({ params, request }: LoaderFunctionArgs) => {
country: member.country,
captain: Boolean(member.isOwner),
inGameName: member.inGameName,
pronouns: member.pronouns,
friendCode: friendCodes[member.userId],
joinedAt: databaseTimestampToDate(member.createdAt).toISOString(),
};

View File

@ -39,6 +39,7 @@ export const loader = async ({ params, request }: LoaderFunctionArgs) => {
"User.customUrl",
"User.discordId",
"User.discordAvatar",
"User.pronouns",
"PlusTier.tier",
jsonArrayFrom(
eb
@ -107,6 +108,7 @@ export const loader = async ({ params, request }: LoaderFunctionArgs) => {
: null,
url: `https://sendou.ink/u/${user.customUrl ?? user.discordId}`,
country: user.country,
pronouns: user.pronouns,
plusServerTier: user.tier as GetUserResponse["plusServerTier"],
socials: {
twitch: user.twitch,

View File

@ -37,6 +37,12 @@ export interface GetUserResponse {
badges: Array<Badge>;
/** Teams user is member of. The main team is always first in the array. */
teams: Array<GlobalTeamMembership>;
/**
* User's pronouns.
*
* @example { "subject": "he", "object": "him" }
*/
pronouns: Pronouns | null;
peakXp: number | null;
/** Users current (or previous if it's off-season) ranked season (SendouQ & ranked tournaments) rank. Null if no rank for the season in question or the season does not have yet enough players on the leaderboard. */
currentRank: SeasonalRank | null;
@ -225,6 +231,12 @@ export type GetTournamentTeamsResponse = Array<{
* @example "Sendou#2955"
*/
inGameName: string | null;
/**
* User's pronouns.
*
* @example { "subject": "he", "object": "him" }
*/
pronouns: Pronouns | null;
/**
* Switch friend code used for identification purposes.
*
@ -365,6 +377,12 @@ interface TournamentOrganizationMember {
* @example "79237403620945920"
*/
discordId: string;
/**
* User's pronouns.
*
* @example { "subject": "he", "object": "him" }
*/
pronouns: Pronouns | null;
role: "ADMIN" | "MEMBER" | "ORGANIZER" | "STREAMER";
roleDisplayName: string | null;
}
@ -425,6 +443,14 @@ type RankTierName =
| "BRONZE"
| "IRON";
type SubjectPronoun = "he" | "she" | "they" | "it" | "any";
type ObjectPronoun = "him" | "her" | "them" | "its" | "all";
export interface Pronouns {
subject: SubjectPronoun;
object: ObjectPronoun;
}
type Badge = {
/**
* @example "Monday Afterparty"

View File

@ -30,7 +30,7 @@ export interface ChatMessage {
export type ChatUser = Pick<
Tables["User"],
"username" | "discordId" | "discordAvatar"
"username" | "discordId" | "discordAvatar" | "pronouns"
> & {
chatNameColor: string | null;
title?: string;

View File

@ -214,9 +214,20 @@ function Message({
}) {
return (
<li className="chat__message">
{user ? <Avatar user={user} size="xs" /> : null}
{user ? (
<div
className={clsx("chat__avatar-wrapper", {
"chat__avatar-wrapper--staff": user.title,
})}
>
<Avatar user={user} size="xs" />
{user.title ? (
<span className="chat__avatar-badge">{user.title}</span>
) : null}
</div>
) : null}
<div>
<div className="stack horizontal sm items-center">
<div className="chat__message__info">
<div
className="chat__message__user"
style={
@ -227,10 +238,10 @@ function Message({
>
{user?.username ?? missingUserName}
</div>
{user?.title ? (
<div className="text-xs text-theme-secondary font-semi-bold">
{user.title}
</div>
{user?.pronouns ? (
<span className="chat__pronouns-tag">
{user.pronouns.subject}/{user.pronouns.object}
</span>
) : null}
{!message.pending ? (
<MessageTimestamp timestamp={message.timestamp} />

View File

@ -103,6 +103,7 @@ function groupWithTeamAndMembers(
"GroupMember.role",
"GroupMember.note",
"User.inGameName",
"User.pronouns",
"User.vc",
"User.languages",
"User.noScreen",

View File

@ -33,6 +33,7 @@ export async function findCurrentGroups() {
discordId: Tables["User"]["discordId"];
discordAvatar: Tables["User"]["discordAvatar"];
customUrl: Tables["User"]["customUrl"];
pronouns: Tables["User"]["pronouns"] | null;
mapModePreferences: Tables["User"]["mapModePreferences"];
noScreen: Tables["User"]["noScreen"];
languages: Tables["User"]["languages"];

View File

@ -340,6 +340,11 @@ function GroupMember({
member.username
)}
</Link>
{member.pronouns ? (
<span className="text-lighter ml-1 text-xxxs">
{member.pronouns.subject}/{member.pronouns.object}
</span>
) : null}
</div>
<div className="ml-auto stack horizontal sm items-center">
{showActions || displayOnly ? (

View File

@ -76,7 +76,7 @@ export function MatchRosters({
<li key={p.id}>
<Link
to={userPage(p)}
className={clsx("stack horizontal sm", {
className={clsx("stack horizontal sm items-center", {
[INACTIVE_PLAYER_CSS]:
teamOneParticipatedPlayers.length > 0 &&
teamOneParticipatedPlayers.every(
@ -87,6 +87,11 @@ export function MatchRosters({
>
<Avatar user={p} size="xxs" />
{p.username}
{p.pronouns ? (
<span className="text-lighter ml-1 text-xxxs">
{p.pronouns.subject}/{p.pronouns.object}
</span>
) : null}
</Link>
</li>
);
@ -130,7 +135,7 @@ export function MatchRosters({
<li key={p.id}>
<Link
to={userPage(p)}
className={clsx("stack horizontal sm", {
className={clsx("stack horizontal sm items-center", {
[INACTIVE_PLAYER_CSS]:
teamTwoParticipatedPlayers.length > 0 &&
teamTwoParticipatedPlayers.every(
@ -141,6 +146,11 @@ export function MatchRosters({
>
<Avatar user={p} size="xxs" />
{p.username}
{p.pronouns ? (
<span className="text-lighter ml-1 text-xxxs">
{p.pronouns.subject}/{p.pronouns.object}
</span>
) : null}
</Link>
</li>
);

View File

@ -662,11 +662,11 @@ function StartedMatchTabs({
...data.match.players.map((p) => ({ ...p, title: undefined })),
...(tournament.ctx.organization?.members ?? []).map((m) => ({
...m,
title: m.role === "STREAMER" ? "Stream" : "TO",
title: m.role === "STREAMER" ? "Cast" : "TO",
})),
...tournament.ctx.staff.map((s) => ({
...s,
title: s.role === "STREAMER" ? "Stream" : "TO",
title: s.role === "STREAMER" ? "Cast" : "TO",
})),
{
...tournament.ctx.author,

View File

@ -6929,6 +6929,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ORGANIZER",
id: 405,
username: "ely",
pronouns: null,
discordId: "260999523806085120",
discordAvatar: "4f15f20946fbd992ee9d694a539e6317",
customUrl: "elemental",
@ -6939,6 +6940,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ADMIN",
id: 622,
username: ".jpg",
pronouns: null,
discordId: "201922904781357057",
discordAvatar: "7fa46b7dc27fa589d3d278ba4b60224f",
customUrl: "dotjpg",
@ -6949,6 +6951,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ADMIN",
id: 680,
username: "inkfarer",
pronouns: null,
discordId: "87494390724964352",
discordAvatar: "3b82ee3101ba39120b6a65c042a04a37",
customUrl: "inkfarer",
@ -6959,6 +6962,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ADMIN",
id: 936,
username: "Raze",
pronouns: null,
discordId: "119620026767507456",
discordAvatar: "aa1ff5b8eefd5a26657c411138a160b8",
customUrl: null,
@ -6969,6 +6973,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ADMIN",
id: 1402,
username: "grace",
pronouns: null,
discordId: "216335108037148673",
discordAvatar: "458f1e233a3b590a62f6b867b95a6241",
customUrl: "grace",
@ -6979,6 +6984,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ORGANIZER",
id: 1755,
username: "BrushStrokes",
pronouns: null,
discordId: "200777324520538113",
discordAvatar: "a_d71ac2f474ce422ce711e8e74d657b2f",
customUrl: "brushstrokes",
@ -6989,6 +6995,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ORGANIZER",
id: 2908,
username: "KitsuneKeira",
pronouns: null,
discordId: "112254088992792576",
discordAvatar: "711e8d48f316687faa4fdb41ab9298f0",
customUrl: "kitsunekeira",
@ -6999,6 +7006,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ADMIN",
id: 3742,
username: "Thoma",
pronouns: null,
discordId: "124007565758693376",
discordAvatar: "ca9e37c9b31dfa39f88b2a2da2d4af21",
customUrl: "thoma",
@ -7009,6 +7017,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ADMIN",
id: 3806,
username: "vlee",
pronouns: null,
discordId: "113026708071821312",
discordAvatar: "4b3f0da55a834acc0beb258edd9c7e34",
customUrl: null,
@ -7019,6 +7028,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ADMIN",
id: 4941,
username: "HoeenHero",
pronouns: null,
discordId: "236292964052107264",
discordAvatar: "c95b9a8cfb9164f3a66267a5e8cfe8b1",
customUrl: "hoeenhero",
@ -7029,6 +7039,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ORGANIZER",
id: 5036,
username: "toastγ",
pronouns: null,
discordId: "248232091005747201",
discordAvatar: "40a21a204f8fae6ae2e7e8c5de70de83",
customUrl: "toasty",
@ -7039,6 +7050,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ADMIN",
id: 8098,
username: "Popgun",
pronouns: null,
discordId: "442431978269310987",
discordAvatar: "e0fd0fed98a4d3c3bfd56332678d4e6c",
customUrl: "popgun",
@ -7049,6 +7061,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ORGANIZER",
id: 8750,
username: "LiberoWolf",
pronouns: null,
discordId: "273188925189914628",
discordAvatar: "c62afa020e24ead92cc043ffa809ffdc",
customUrl: "liberowolf",
@ -7059,6 +7072,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ADMIN",
id: 9222,
username: "Jardonian",
pronouns: null,
discordId: "298241282550267906",
discordAvatar: "f69bb5af745eca4e9b7f55504c641f78",
customUrl: "jardonian",
@ -7069,6 +7083,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ORGANIZER",
id: 9719,
username: "Scepidilionz",
pronouns: null,
discordId: "184478601171828737",
discordAvatar: "75dedb3527b73d9571151f0a00d1c365",
customUrl: "scepidilionz",
@ -7079,6 +7094,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
role: "ORGANIZER",
id: 18720,
username: "Tulip",
pronouns: null,
discordId: "103988435785650176",
discordAvatar: "df9936bea9dcbd250daf8e2ef2d7c04a",
customUrl: "tulip",
@ -7090,6 +7106,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
author: {
id: 4941,
username: "HoeenHero",
pronouns: null,
discordId: "236292964052107264",
discordAvatar: "c95b9a8cfb9164f3a66267a5e8cfe8b1",
customUrl: "hoeenhero",
@ -7099,6 +7116,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 405,
username: "ely",
pronouns: null,
discordId: "260999523806085120",
discordAvatar: "4f15f20946fbd992ee9d694a539e6317",
customUrl: "elemental",
@ -7108,6 +7126,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 446,
username: "pock",
pronouns: null,
discordId: "176095582534762496",
discordAvatar: "89e15b6e74f5abdef1183c9416434dde",
customUrl: "pock",
@ -7117,6 +7136,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 680,
username: "inkfarer",
pronouns: null,
discordId: "87494390724964352",
discordAvatar: "3b82ee3101ba39120b6a65c042a04a37",
customUrl: "inkfarer",
@ -7126,6 +7146,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 787,
username: "IV Shads",
pronouns: null,
discordId: "334504066405367808",
discordAvatar: "0d31f0d52ebfeaa0216fcacb86eb140a",
customUrl: "shads",
@ -7135,6 +7156,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 2908,
username: "KitsuneKeira",
pronouns: null,
discordId: "112254088992792576",
discordAvatar: "711e8d48f316687faa4fdb41ab9298f0",
customUrl: "kitsunekeira",
@ -7144,6 +7166,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 2963,
username: "Lepus",
pronouns: null,
discordId: "412316772637736981",
discordAvatar: "1408d204fa8a128efd2d2625476468c2",
customUrl: null,
@ -7153,6 +7176,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 5877,
username: "Koreki",
pronouns: null,
discordId: "578038263433134080",
discordAvatar: "f552df977e0165e7fb93d1ce2a7512d4",
customUrl: "bars",
@ -7162,6 +7186,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 6766,
username: "Bowen",
pronouns: null,
discordId: "230161540299489280",
discordAvatar: "a_3ca2a0737b2c1e2b5e82ddc98fe79c8b",
customUrl: "bowen",
@ -7171,6 +7196,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 7400,
username: "Toes",
pronouns: null,
discordId: "678892046534311936",
discordAvatar: "11490e6c0ace327ebc32a117b9e0510c",
customUrl: "toes",
@ -7180,6 +7206,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 8277,
username: "Neato",
pronouns: null,
discordId: "512418782933811221",
discordAvatar: "c3afd465b53dedbb97fb9dd504d01305",
customUrl: "neato",
@ -7189,6 +7216,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 22026,
username: "strings 🎻",
pronouns: null,
discordId: "182994907907096585",
discordAvatar: "31da63dcb6dd1dbe4c3f135c105f07e7",
customUrl: "strings",
@ -7198,6 +7226,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 23094,
username: "みちさん",
pronouns: null,
discordId: "725416982681223259",
discordAvatar: "cb9bf51b05f22c763a2b4812bdd574cc",
customUrl: "michi",
@ -7207,6 +7236,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 29467,
username: "glumbaron",
pronouns: null,
discordId: "367803257717784599",
discordAvatar: "b8ad30de9487a9699093b728098e01d0",
customUrl: "glumbaron",
@ -7216,6 +7246,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 29775,
username: "Lemon7890",
pronouns: null,
discordId: "1058063829973618698",
discordAvatar: "dc110c2d77ea84e470c87a18ac0b7e5d",
customUrl: "lemon7890",
@ -7225,6 +7256,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 30996,
username: "eemee",
pronouns: null,
discordId: "1132918323697418310",
discordAvatar: "48089383c5d666ae7ef8417d205bfa1f",
customUrl: "eemeee",
@ -7234,6 +7266,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({
{
id: 31736,
username: "vheavy ☃",
pronouns: null,
discordId: "689577992430944281",
discordAvatar: "911c0ac66f9489406ea4ae970e7ed5b0",
customUrl: "pin-eye",

View File

@ -2032,6 +2032,7 @@ export const SWIM_OR_SINK_167 = (
role: "ORGANIZER",
id: 405,
username: "ely",
pronouns: null,
discordId: "260999523806085120",
discordAvatar: "a_71a6a4b4f76bd79bc9d7743e322a879d",
customUrl: "elemental",
@ -2042,6 +2043,7 @@ export const SWIM_OR_SINK_167 = (
role: "ADMIN",
id: 622,
username: ".jpg",
pronouns: null,
discordId: "201922904781357057",
discordAvatar: "7fa46b7dc27fa589d3d278ba4b60224f",
customUrl: "dotjpg",
@ -2052,6 +2054,7 @@ export const SWIM_OR_SINK_167 = (
role: "ADMIN",
id: 680,
username: "inkfarer",
pronouns: null,
discordId: "87494390724964352",
discordAvatar: "3b82ee3101ba39120b6a65c042a04a37",
customUrl: "inkfarer",
@ -2062,6 +2065,7 @@ export const SWIM_OR_SINK_167 = (
role: "ADMIN",
id: 936,
username: "Raze",
pronouns: null,
discordId: "119620026767507456",
discordAvatar: "aa1ff5b8eefd5a26657c411138a160b8",
customUrl: null,
@ -2072,6 +2076,7 @@ export const SWIM_OR_SINK_167 = (
role: "ADMIN",
id: 1402,
username: "grace",
pronouns: null,
discordId: "216335108037148673",
discordAvatar: "458f1e233a3b590a62f6b867b95a6241",
customUrl: "grace",
@ -2082,6 +2087,7 @@ export const SWIM_OR_SINK_167 = (
role: "ORGANIZER",
id: 1755,
username: "BrushStrokes",
pronouns: null,
discordId: "200777324520538113",
discordAvatar: "a_d71ac2f474ce422ce711e8e74d657b2f",
customUrl: "brushstrokes",
@ -2092,6 +2098,7 @@ export const SWIM_OR_SINK_167 = (
role: "ORGANIZER",
id: 2908,
username: "KitsuneKeira",
pronouns: null,
discordId: "112254088992792576",
discordAvatar: "711e8d48f316687faa4fdb41ab9298f0",
customUrl: "kitsunekeira",
@ -2102,6 +2109,7 @@ export const SWIM_OR_SINK_167 = (
role: "ADMIN",
id: 3742,
username: "Thoma",
pronouns: null,
discordId: "124007565758693376",
discordAvatar: "702429723f31a57326f87d11063139f7",
customUrl: "thoma",
@ -2112,6 +2120,7 @@ export const SWIM_OR_SINK_167 = (
role: "ADMIN",
id: 3806,
username: "vlee",
pronouns: null,
discordId: "113026708071821312",
discordAvatar: "4b3f0da55a834acc0beb258edd9c7e34",
customUrl: null,
@ -2122,6 +2131,7 @@ export const SWIM_OR_SINK_167 = (
role: "ADMIN",
id: 4941,
username: "HoeenHero",
pronouns: null,
discordId: "236292964052107264",
discordAvatar: "c95b9a8cfb9164f3a66267a5e8cfe8b1",
customUrl: "hoeenhero",
@ -2132,6 +2142,7 @@ export const SWIM_OR_SINK_167 = (
role: "ORGANIZER",
id: 5036,
username: "toastγ",
pronouns: null,
discordId: "248232091005747201",
discordAvatar: "40a21a204f8fae6ae2e7e8c5de70de83",
customUrl: "toasty",
@ -2142,6 +2153,7 @@ export const SWIM_OR_SINK_167 = (
role: "ADMIN",
id: 8098,
username: "Popgun",
pronouns: null,
discordId: "442431978269310987",
discordAvatar: "e0fd0fed98a4d3c3bfd56332678d4e6c",
customUrl: "popgun",
@ -2152,6 +2164,7 @@ export const SWIM_OR_SINK_167 = (
role: "ORGANIZER",
id: 8750,
username: "LiberoWolf",
pronouns: null,
discordId: "273188925189914628",
discordAvatar: "c62afa020e24ead92cc043ffa809ffdc",
customUrl: "liberowolf",
@ -2162,6 +2175,7 @@ export const SWIM_OR_SINK_167 = (
role: "ADMIN",
id: 9222,
username: "Jardonian",
pronouns: null,
discordId: "298241282550267906",
discordAvatar: "f69bb5af745eca4e9b7f55504c641f78",
customUrl: "jardonian",
@ -2172,6 +2186,7 @@ export const SWIM_OR_SINK_167 = (
role: "ORGANIZER",
id: 9719,
username: "Scepidilionz",
pronouns: null,
discordId: "184478601171828737",
discordAvatar: "75dedb3527b73d9571151f0a00d1c365",
customUrl: "scepidilionz",
@ -2182,6 +2197,7 @@ export const SWIM_OR_SINK_167 = (
role: "ORGANIZER",
id: 18720,
username: "Tulip",
pronouns: null,
discordId: "103988435785650176",
discordAvatar: "5fef4bf0c1b8a6a76fe2f43b956bfc3d",
customUrl: "tulip",
@ -2193,6 +2209,7 @@ export const SWIM_OR_SINK_167 = (
author: {
id: 1402,
username: "grace",
pronouns: null,
discordId: "216335108037148673",
discordAvatar: "458f1e233a3b590a62f6b867b95a6241",
customUrl: "grace",
@ -2202,6 +2219,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 52,
username: "Roundy",
pronouns: null,
discordId: "333766288969302018",
discordAvatar: "42d40d5ae6ff7081ae57bc02b6e2f717",
customUrl: null,
@ -2211,6 +2229,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 405,
username: "ely",
pronouns: null,
discordId: "260999523806085120",
discordAvatar: "a_71a6a4b4f76bd79bc9d7743e322a879d",
customUrl: "elemental",
@ -2220,6 +2239,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 451,
username: "Half",
pronouns: null,
discordId: "468596581357060097",
discordAvatar: "940589e5c6793a5cbbab2adebd84fe0b",
customUrl: null,
@ -2229,6 +2249,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 570,
username: "SuperaJokera",
pronouns: null,
discordId: "418176537561661441",
discordAvatar: "bab3e7a9cdb2071de7f2ae29256fc83b",
customUrl: null,
@ -2238,6 +2259,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 657,
username: "lost memory.",
pronouns: null,
discordId: "302160815132246016",
discordAvatar: "da7cfcd1a5b8bee37cfa5d308b0898eb",
customUrl: "mashimashi",
@ -2247,6 +2269,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 3266,
username: "Tux",
pronouns: null,
discordId: "183025242266927104",
discordAvatar: "a9475b488962953152c60f4f138b1618",
customUrl: "tux",
@ -2256,6 +2279,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 4285,
username: "Tbob408",
pronouns: null,
discordId: "343219263655510021",
discordAvatar: "f30c675fc07203ca112d93fd03b5cc96",
customUrl: "tbob408",
@ -2265,6 +2289,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 5239,
username: "Super_ryn_",
pronouns: null,
discordId: "390444783425945602",
discordAvatar: "e821ac7a457033d6c990bcaf518287e5",
customUrl: null,
@ -2274,6 +2299,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 5639,
username: "reef",
pronouns: null,
discordId: "422790410566500352",
discordAvatar: "77b479e49ec0d09edb8f9b975bff04ce",
customUrl: "reefsixes",
@ -2283,6 +2309,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 8695,
username: "kloud",
pronouns: null,
discordId: "360259023389327361",
discordAvatar: "c5a2506e46e135b2568ef48242f669e8",
customUrl: "kloud",
@ -2292,6 +2319,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 9678,
username: "Justin | PipedreamDX 💜",
pronouns: null,
discordId: "247504664378081280",
discordAvatar: "a_a60bcc9c76d4baa9814287fdc5c28fe9",
customUrl: "pipedreamdx",
@ -2301,6 +2329,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 9719,
username: "Scepidilionz",
pronouns: null,
discordId: "184478601171828737",
discordAvatar: "75dedb3527b73d9571151f0a00d1c365",
customUrl: "scepidilionz",
@ -2310,6 +2339,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 18461,
username: "Riley Rooster",
pronouns: null,
discordId: "565712290020589569",
discordAvatar: "498b21d6f64dcd56d06e61c2ec39e571",
customUrl: "rooster",
@ -2319,6 +2349,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 18720,
username: "Tulip",
pronouns: null,
discordId: "103988435785650176",
discordAvatar: "5fef4bf0c1b8a6a76fe2f43b956bfc3d",
customUrl: "tulip",
@ -2328,6 +2359,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 24117,
username: "Boltz!",
pronouns: null,
discordId: "221418644297482250",
discordAvatar: "6b7156dcd0582ee160564bfa0c5cdc0e",
customUrl: "fusionboltzgx",
@ -2337,6 +2369,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 28303,
username: "Lagoon",
pronouns: null,
discordId: "458714559855722497",
discordAvatar: "b815bb6090c2b32fec23f1336fae5663",
customUrl: null,
@ -2346,6 +2379,7 @@ export const SWIM_OR_SINK_167 = (
{
id: 28482,
username: "phantom 👻",
pronouns: null,
discordId: "599633578648928307",
discordAvatar: "f5139304fb364bca35634a8e5cd11c0f",
customUrl: "phantom_spl",

View File

@ -331,6 +331,7 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({
author: {
id: 13370,
username: "Puma",
pronouns: null,
discordId: "308483655515373570",
discordAvatar: "a5fff2b4706d99364e646cab28c8085b",
customUrl: "puma",
@ -340,6 +341,7 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({
{
id: 1183,
username: "goobler",
pronouns: null,
discordId: "395757059922198548",
discordAvatar: "2a569302e9545c6a07f8f8aa337d139d",
customUrl: "penis",
@ -349,6 +351,7 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({
{
id: 3147,
username: "Cookie",
pronouns: null,
discordId: "267963609924108288",
discordAvatar: "85090cfe2e0da693355bcec9740c1eaa",
customUrl: "cookie",
@ -358,6 +361,7 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({
{
id: 5212,
username: "Mars",
pronouns: null,
discordId: "507102073427460098",
discordAvatar: "bd634c91f7d0475f3671956fa9a2110a",
customUrl: null,
@ -367,6 +371,7 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({
{
id: 23120,
username: "micah",
pronouns: null,
discordId: "111682034056835072",
discordAvatar: "f1191c94b1da5396a06b620408017c1f",
customUrl: "weizihao",

View File

@ -1462,6 +1462,7 @@ export const PADDLING_POOL_257 = () =>
author: {
id: 860,
username: "공주 Alice",
pronouns: null,
discordId: "163771047068303360",
discordAvatar: "b33d8f230218d6a92705a63fdf803851",
customUrl: "alicetheto",
@ -1471,6 +1472,7 @@ export const PADDLING_POOL_257 = () =>
{
id: 1536,
username: "Pinky",
pronouns: null,
discordId: "178489224192851969",
discordAvatar: "8b8c1d85cc525ea366f3ce2a6a594c05",
customUrl: "pinky",
@ -1480,6 +1482,7 @@ export const PADDLING_POOL_257 = () =>
{
id: 1662,
username: "Andromeda",
pronouns: null,
discordId: "275213752025088000",
discordAvatar: "25bf68c5aa4e622ceb5a241c34841c6d",
customUrl: null,
@ -1489,6 +1492,7 @@ export const PADDLING_POOL_257 = () =>
{
id: 6648,
username: "Hαzε",
pronouns: null,
discordId: "195618756800675841",
discordAvatar: "a_03ec4bbcb2a4ab000237c9f3e9e71508",
customUrl: "sdomi19",
@ -1498,6 +1502,7 @@ export const PADDLING_POOL_257 = () =>
{
id: 12717,
username: "Browni",
pronouns: null,
discordId: "413759870333091884",
discordAvatar: "a_b55f70ada809a600e73c5088b910e659",
customUrl: "brufnie",
@ -7434,6 +7439,7 @@ export const PADDLING_POOL_255 = () =>
author: {
id: 860,
username: "공주 Alice",
pronouns: null,
discordId: "163771047068303360",
discordAvatar: "b33d8f230218d6a92705a63fdf803851",
customUrl: "alicetheto",
@ -7443,6 +7449,7 @@ export const PADDLING_POOL_255 = () =>
{
id: 1536,
username: "Pinky",
pronouns: null,
discordId: "178489224192851969",
discordAvatar: "8b8c1d85cc525ea366f3ce2a6a594c05",
customUrl: "pinky",
@ -7452,6 +7459,7 @@ export const PADDLING_POOL_255 = () =>
{
id: 1662,
username: "Andromeda",
pronouns: null,
discordId: "275213752025088000",
discordAvatar: "25bf68c5aa4e622ceb5a241c34841c6d",
customUrl: null,
@ -7461,6 +7469,7 @@ export const PADDLING_POOL_255 = () =>
{
id: 6648,
username: "Hαzε",
pronouns: null,
discordId: "195618756800675841",
discordAvatar: "a_03ec4bbcb2a4ab000237c9f3e9e71508",
customUrl: "sdomi19",
@ -7470,6 +7479,7 @@ export const PADDLING_POOL_255 = () =>
{
id: 12717,
username: "Browni",
pronouns: null,
discordId: "413759870333091884",
discordAvatar: "a_b55f70ada809a600e73c5088b910e659",
customUrl: "brufnie",
@ -13715,6 +13725,7 @@ export const IN_THE_ZONE_32 = ({
author: {
id: 274,
username: "Sendou",
pronouns: null,
discordId: "79237403620945920",
discordAvatar: "6fc41a44b069a0d2152ac06d1e496c6c",
customUrl: "sendou",
@ -13724,6 +13735,7 @@ export const IN_THE_ZONE_32 = ({
{
id: 860,
username: "공주 Alice",
pronouns: null,
discordId: "163771047068303360",
discordAvatar: "b33d8f230218d6a92705a63fdf803851",
customUrl: "alicetheto",
@ -13733,6 +13745,7 @@ export const IN_THE_ZONE_32 = ({
{
id: 12717,
username: "Browni",
pronouns: null,
discordId: "413759870333091884",
discordAvatar: "a_b55f70ada809a600e73c5088b910e659",
customUrl: "brufnie",

View File

@ -96,6 +96,7 @@ export const testTournament = ({
discordAvatar: null,
discordId: "123",
username: "test",
pronouns: null,
id: 1,
},
...ctx,

View File

@ -31,7 +31,8 @@ const stm = sql.prepare(/* sql */ `
"User"."customUrl",
'discordAvatar',
"User"."discordAvatar",
'chatNameColor', IIF(COALESCE("User"."patronTier", 0) >= 2, "User"."css" ->> 'chat', null)
'chatNameColor', IIF(COALESCE("User"."patronTier", 0) >= 2, "User"."css" ->> 'chat', null),
'pronouns', json("User"."pronouns")
)
) as "players"
from "TournamentMatch"
@ -85,6 +86,7 @@ export const findMatchById = (id: number) => {
customUrl: Tables["User"]["customUrl"];
discordAvatar: Tables["User"]["discordAvatar"];
chatNameColor: string | null;
pronouns: Tables["User"]["pronouns"];
}>
).filter((player) => player.id),
};

View File

@ -146,11 +146,11 @@ function BeforeMatchChat() {
...data.match.players.map((p) => ({ ...p, title: undefined })),
...(tournament.ctx.organization?.members ?? []).map((m) => ({
...m,
title: m.role === "STREAMER" ? "Stream" : "TO",
title: m.role === "STREAMER" ? "Cast" : "TO",
})),
...tournament.ctx.staff.map((s) => ({
...s,
title: s.role === "STREAMER" ? "Stream" : "TO",
title: s.role === "STREAMER" ? "Cast" : "TO",
})),
{
...tournament.ctx.author,

View File

@ -83,6 +83,7 @@ export async function findById(id: number) {
"TournamentOrganizationMember.role",
...COMMON_USER_FIELDS,
userChatNameColor,
"User.pronouns",
])
.whereRef(
"TournamentOrganizationMember.organizationId",
@ -101,7 +102,7 @@ export async function findById(id: number) {
jsonObjectFrom(
eb
.selectFrom("User")
.select([...COMMON_USER_FIELDS, userChatNameColor])
.select([...COMMON_USER_FIELDS, userChatNameColor, "User.pronouns"])
.whereRef("User.id", "=", "CalendarEvent.authorId"),
).as("author"),
jsonArrayFrom(
@ -111,6 +112,7 @@ export async function findById(id: number) {
.select([
...COMMON_USER_FIELDS,
userChatNameColor,
"User.pronouns",
"TournamentStaff.role",
])
.where("TournamentStaff.tournamentId", "=", id),

View File

@ -167,6 +167,7 @@ export async function findProfileByIdentifier(
"User.favoriteBadgeIds",
"User.patronTier",
"PlusTier.tier as plusTier",
"User.pronouns",
jsonArrayFrom(
eb
.selectFrom("UserWeapon")
@ -453,6 +454,7 @@ export async function findChatUsersByUserIds(userIds: number[]) {
"User.discordId",
"User.discordAvatar",
"User.username",
"User.pronouns",
userChatNameColor,
])
.where("User.id", "in", userIds)
@ -895,6 +897,7 @@ type UpdateProfileArgs = Pick<
| "customName"
| "motionSens"
| "stickSens"
| "pronouns"
| "inGameName"
| "battlefy"
| "css"
@ -936,6 +939,7 @@ export function updateProfile(args: UpdateProfileArgs) {
customName: args.customName,
motionSens: args.motionSens,
stickSens: args.stickSens,
pronouns: args.pronouns,
inGameName: args.inGameName,
css: args.css,
battlefy: args.battlefy,

View File

@ -28,9 +28,18 @@ export const action: ActionFunction = async ({ request }) => {
? `${inGameNameText}#${inGameNameDiscriminator}`
: null;
const pronouns =
data.subjectPronoun && data.objectPronoun
? JSON.stringify({
subject: data.subjectPronoun,
object: data.objectPronoun,
})
: null;
try {
const editedUser = await UserRepository.updateProfile({
...data,
pronouns,
inGameName,
userId: user.id,
});

View File

@ -22,6 +22,8 @@ const DEFAULT_FIELDS = {
motionSens: null,
showDiscordUniqueName: 1,
stickSens: null,
objectPronoun: null,
subjectPronoun: null,
weapons: JSON.stringify([
{ weaponSplId: 1 as MainWeaponId, isFavorite: 0 },
]) as any,

View File

@ -16,7 +16,7 @@ import { TrashIcon } from "~/components/icons/Trash";
import { Label } from "~/components/Label";
import { SubmitButton } from "~/components/SubmitButton";
import { WeaponSelect } from "~/components/WeaponSelect";
import type { Tables } from "~/db/tables";
import { OBJECT_PRONOUNS, SUBJECT_PRONOUNS, type Tables } from "~/db/tables";
import { BADGE } from "~/features/badges/badges-constants";
import { BadgesSelector } from "~/features/badges/components/BadgesSelector";
import { useIsMounted } from "~/hooks/useIsMounted";
@ -53,6 +53,7 @@ export default function UserEditPage() {
<CustomUrlInput parentRouteData={layoutData} />
<InGameNameInputs />
<SensSelects />
<PronounsSelect />
<BattlefyInput />
<CountrySelect />
<FavBadgeSelect />
@ -210,6 +211,52 @@ function SensSelects() {
);
}
function PronounsSelect() {
const { t } = useTranslation(["user"]);
const data = useLoaderData<typeof loader>();
return (
<div>
<div className="stack horizontal md">
<div>
<Label htmlFor="subjectPronoun">{t("user:pronoun")}</Label>
<select
id="subjectPronoun"
name="subjectPronoun"
defaultValue={data.user.pronouns?.subject ?? undefined}
className={styles.sensSelect}
>
<option value="">{"-"}</option>
{SUBJECT_PRONOUNS.map((pronoun) => (
<option key={pronoun} value={pronoun}>
{pronoun}
</option>
))}
</select>
<span className={styles.seperator}>/</span>
</div>
<div>
<Label htmlFor="objectPronoun">{t("user:pronoun")}</Label>
<select
id="objectPronoun"
name="objectPronoun"
defaultValue={data.user.pronouns?.object ?? undefined}
className={styles.sensSelect}
>
<option value="">{"-"}</option>
{OBJECT_PRONOUNS.map((pronoun) => (
<option key={pronoun} value={pronoun}>
{pronoun}
</option>
))}
</select>
</div>
</div>
<FormMessage type="info">{t("user:pronounsInfo")}</FormMessage>
</div>
);
}
function CountrySelect() {
const { t, i18n } = useTranslation(["user"]);
const data = useLoaderData<typeof loader>();

View File

@ -261,6 +261,14 @@ function ExtraInfos() {
{data.user.discordUniqueName}
</div>
)}
{data.user.pronouns && (
<div className="u__extra-info">
<span className="u__extra-info__heading">
{t("user:usesPronouns")}
</span>{" "}
{data.user.pronouns.subject}/{data.user.pronouns.object}
</div>
)}
{data.user.inGameName && (
<div className="u__extra-info">
<span className="u__extra-info__heading">{t("user:ign.short")}</span>{" "}

View File

@ -1,4 +1,5 @@
import { z } from "zod";
import { OBJECT_PRONOUNS, SUBJECT_PRONOUNS } from "~/db/tables";
import { BADGE } from "~/features/badges/badges-constants";
import { isCustomUrl } from "~/utils/urls";
import {
@ -10,6 +11,7 @@ import {
emptyArrayToNull,
falsyToNull,
id,
nullLiteraltoNull,
processMany,
safeJSONParse,
safeNullableStringSchema,
@ -84,6 +86,14 @@ export const userEditActionSchema = z
.refine((val) => val % 5 === 0)
.nullable(),
),
subjectPronoun: z.preprocess(
processMany(nullLiteraltoNull, falsyToNull),
z.enum(SUBJECT_PRONOUNS).nullable(),
),
objectPronoun: z.preprocess(
processMany(nullLiteraltoNull, falsyToNull),
z.enum(OBJECT_PRONOUNS).nullable(),
),
inGameNameText: z.preprocess(
falsyToNull,
z.string().max(USER.IN_GAME_NAME_TEXT_MAX_LENGTH).nullable(),

View File

@ -1126,6 +1126,49 @@ html[dir="rtl"] .fix-rtl {
gap: var(--s-2-5);
}
.chat__message__info {
display: flex;
flex-direction: row;
gap: 0 var(--s-1-5);
align-items: center;
flex-wrap: wrap;
}
.chat__avatar-wrapper {
position: relative;
flex-shrink: 0;
}
.chat__avatar-wrapper--staff .avatar {
border: 2px solid var(--theme-secondary);
border-radius: 50%;
}
.chat__avatar-badge {
position: absolute;
bottom: 4px;
left: 50%;
transform: translateX(-50%);
background-color: var(--theme-secondary);
color: var(--black-text);
font-size: var(--fonts-xxxxs);
font-weight: var(--bold);
padding: 1px 4px;
border-radius: var(--rounded-full);
white-space: nowrap;
line-height: 1.2;
}
.chat__pronouns-tag {
background-color: var(--bg-lightest);
color: var(--text-lighter);
font-size: var(--fonts-xxxs);
font-weight: var(--semi-bold);
padding: 1px 5px;
border-radius: var(--rounded-full);
white-space: nowrap;
}
.chat__message__user {
font-weight: var(--semi-bold);
font-size: var(--fonts-sm);
@ -1137,9 +1180,8 @@ html[dir="rtl"] .fix-rtl {
}
.chat__message__time {
font-size: var(--fonts-xxs);
font-size: var(--fonts-xxxs);
color: var(--text-lighter);
margin-block-start: 3px;
}
.chat__input-container {

View File

@ -22,6 +22,10 @@
width: 6rem;
}
.seperator {
margin-left: var(--s-4);
}
.weaponPool {
width: 20rem;
}

Binary file not shown.

View File

@ -10,6 +10,9 @@
"motion": "Bevægelse",
"stick": "Styrepind",
"sens": "Følsomhed",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "Våbenpulje",
"discordExplanation": "Brugernavn, Profilbillede, Youtube-, Bluesky- og Twitch-konter er hentet via din Discord-konto. Se <1>FAQ</1> for yderligere information.",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "Bewegungssteuerung",
"stick": "Stick",
"sens": "Empfindlichkeit",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "Waffenpool",
"discordExplanation": "Der Username, Profilbild, YouTube-, Bluesky- und Twitch-Konten stammen von deinem Discord-Konto. Mehr Infos in den <1>FAQ</1>.",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "Motion",
"stick": "Stick",
"sens": "Sens",
"pronoun": "Pronoun",
"usesPronouns": "Uses",
"pronounsInfo": "This setting is optional! Your pronouns will be displayed on your profile, tournament rosters, SendouQ groups, and text channels.",
"weaponPool": "Weapon pool",
"discordExplanation": "Username, profile picture, YouTube, Bluesky and Twitch accounts come from your Discord account. See <1>FAQ</1> for more information.",
"favoriteBadges": "Favorite badges",

View File

@ -10,6 +10,9 @@
"motion": "Giroscopio",
"stick": "Palanca",
"sens": "Sens",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "Grupo de armas",
"discordExplanation": "Tu nombre, foto, y cuentas de YouTube, Bluesky y Twitch se obtienen por tu cuenta en Discord. Ver <1>FAQ</1> para más información.",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "Giroscopio",
"stick": "Palanca",
"sens": "Sens",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "Grupo de armas",
"discordExplanation": "Tu nombre, foto, y cuentas de YouTube, Bluesky y Twitch se obtienen por tu cuenta en Discord. Ver <1>FAQ</1> para más información.",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "Gyro",
"stick": "Stick",
"sens": "Sens",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "Armes jouées",
"discordExplanation": "Votre pseudo, votre photo de profil et vos comptes Youtube, Bluesky et Twitch viennent de votre compte Discord. Voir la <1>FAQ</1> pour plus d'informations.",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "Gyro",
"stick": "Stick",
"sens": "Sens",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "Armes jouées",
"discordExplanation": "Votre pseudo, votre photo de profil et vos comptes Youtube, Bluesky et Twitch viennent de votre compte Discord. Voir la <1>FAQ</1> pour plus d'informations.",
"favoriteBadges": "Badge favori",

View File

@ -10,6 +10,9 @@
"motion": "תנועה",
"stick": "סטיק",
"sens": "רגישות",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "מאגר נשקים",
"discordExplanation": "שם משתמש, תמונת פרופיל, חשבונות YouTube, Bluesky ו-Twitch מגיעים מחשבון Discord שלך. ראו <1>שאלות נפוצות</1> למידע נוסף.",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "Giroscopio",
"stick": "Joystick",
"sens": "Sens.",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "Pool armi",
"discordExplanation": "Username, foto profilo, account YouTube, Bluesky e Twitch vengono dal tuo account Discord. Visita <1>FAQ</1> per ulteriori informazioni.",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "モーション",
"stick": "スティック",
"sens": "感度",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "使用ブキ",
"discordExplanation": "ユーザー名、プロファイル画像、YouTube、Bluesky と Twitch アカウントは Discord のアカウントに設定されているものが使用されます。詳しくは <1>FAQ</1> をご覧ください。",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "",
"stick": "",
"sens": "",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "",
"discordExplanation": "",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "Beweging",
"stick": "Stick",
"sens": "Gevoeligheid",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "",
"discordExplanation": "",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "Motion",
"stick": "Stick",
"sens": "Sens",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "Pula broni",
"discordExplanation": "Nazwa, profilowe oraz połączone konta brane są z konta Discord. Zobacz <1>FAQ</1> by dowiedzieć się więcej.",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "Movimento (Giroscópio)",
"stick": "Analógico",
"sens": "Sens",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "Seleção de armas",
"discordExplanation": "Nome de usuário, foto de perfil, conta do YouTube, Bluesky e Twitch vêm da sua conta do Discord. Veja o <1>Perguntas Frequentes</1> para mais informações.",
"favoriteBadges": "",

View File

@ -10,6 +10,9 @@
"motion": "Наклон",
"stick": "Стик",
"sens": "Чувствительность",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "Используемое оружие",
"discordExplanation": "Имя пользователя, аватар, ссылка на аккаунты YouTube, Bluesky и Twitch берутся из вашего аккаунта в Discord. Посмотрите <1>FAQ</1> для дополнительной информации.",
"favoriteBadges": "Любимые награды",

View File

@ -10,6 +10,9 @@
"motion": "体感",
"stick": "摇杆",
"sens": "感度",
"pronoun": "",
"usesPronouns": "",
"pronounsInfo": "",
"weaponPool": "武器池",
"discordExplanation": "用户名、头像、Youtube、Bluesky和Twitch账号皆来自您的Discord账号。查看 <1>FAQ</1> 以获得更多相关信息。",
"favoriteBadges": "",

View File

@ -0,0 +1,7 @@
export function up(db) {
db.transaction(() => {
db.prepare(
/* sql */ `alter table "User" add "pronouns" text default null`,
).run();
})();
}