diff --git a/src/util/config/types/GeneralConfiguration.ts b/src/util/config/types/GeneralConfiguration.ts
index cff8c527..df3dfbcd 100644
--- a/src/util/config/types/GeneralConfiguration.ts
+++ b/src/util/config/types/GeneralConfiguration.ts
@@ -29,4 +29,5 @@ export class GeneralConfiguration {
image: string | null = null;
instanceId: string = Snowflake.generate();
autoCreateBotUsers: boolean = false;
+ pomeloEnabled: boolean = false;
}
diff --git a/src/util/dtos/UserDTO.ts b/src/util/dtos/UserDTO.ts
index a24c8d96..5687bcef 100644
--- a/src/util/dtos/UserDTO.ts
+++ b/src/util/dtos/UserDTO.ts
@@ -19,17 +19,21 @@
import { User } from "../entities";
export class MinimalPublicUserDTO {
- avatar?: string | null;
- discriminator: string;
id: string;
- public_flags: number;
username: string;
+ global_name: string;
+ display_name?: string;
+ discriminator: string;
+ public_flags: number;
+ avatar?: string | null;
constructor(user: User) {
- this.avatar = user.avatar;
- this.discriminator = user.discriminator;
this.id = user.id;
- this.public_flags = user.public_flags;
this.username = user.username;
+ this.global_name = user.global_name;
+ this.display_name = user.display_name;
+ this.discriminator = user.discriminator;
+ this.public_flags = user.public_flags;
+ this.avatar = user.avatar;
}
}
diff --git a/src/util/entities/User.ts b/src/util/entities/User.ts
index c6582b00..0620640b 100644
--- a/src/util/entities/User.ts
+++ b/src/util/entities/User.ts
@@ -37,6 +37,8 @@ import { UserSettings } from "./UserSettings";
export enum PublicUserEnum {
username,
+ global_name,
+ display_name,
discriminator,
id,
public_flags,
@@ -90,8 +92,14 @@ export class User extends BaseClass {
@Column()
username: string; // username max length 32, min 2 (should be configurable)
+ @Column({nullable: true})
+ global_name: string; // puyo: pomelo
+
+ @Column({nullable: true})
+ display_name?: string; // puyo: pomelo
+
@Column()
- discriminator: string; // opaque string: 4 digits on discord.com
+ discriminator: string; // opaque string: 4 digits on discord.com, 0 for pomelo
@Column({ nullable: true })
avatar?: string; // hash of the user avatar
@@ -323,6 +331,13 @@ export class User extends BaseClass {
}
}
+ public get handle(): string {
+ const {pomeloEnabled} = Config.get().general;
+
+ // if pomelo is enabled, global_name should be set
+ return pomeloEnabled ? this.global_name as string : `${this.username}#${this.discriminator}`;
+ }
+
static async register({
email,
username,
@@ -337,19 +352,25 @@ export class User extends BaseClass {
id?: string;
req?: Request;
}) {
+ const {pomeloEnabled} = Config.get().general;
+
// trim special uf8 control characters -> Backspace, Newline, ...
username = trimSpecial(username);
- const discriminator = await User.generateDiscriminator(username);
- if (!discriminator) {
- // We've failed to generate a valid and unused discriminator
- throw FieldErrors({
- username: {
- code: "USERNAME_TOO_MANY_USERS",
- message:
- req?.t("auth:register.USERNAME_TOO_MANY_USERS") || "",
- },
- });
+ let discriminator: string | undefined;
+ if(pomeloEnabled) discriminator = "0";
+ else {
+ discriminator = await User.generateDiscriminator(username);
+ if (!discriminator) {
+ // We've failed to generate a valid and unused discriminator
+ throw FieldErrors({
+ username: {
+ code: "USERNAME_TOO_MANY_USERS",
+ message:
+ req?.t("auth:register.USERNAME_TOO_MANY_USERS") || "",
+ },
+ });
+ }
}
// TODO: save date_of_birth
@@ -364,6 +385,8 @@ export class User extends BaseClass {
const user = User.create({
username: username,
+ global_name: username, // TODO: convert to lowercase, strip special characters,etc???
+ // display_name: username, // TODO: how should we do this?
discriminator,
id: id || Snowflake.generate(),
email: email,
@@ -391,7 +414,7 @@ export class User extends BaseClass {
if (!Config.get().defaults.user.verified && email) {
await Email.sendVerifyEmail(user, email).catch((e) => {
console.error(
- `Failed to send verification email to ${user.username}#${user.discriminator}: ${e}`,
+ `Failed to send verification email to ${user.handle}: ${e}`,
);
});
}
diff --git a/src/util/schemas/RelationshipPostSchema.ts b/src/util/schemas/RelationshipPostSchema.ts
index 066ecfd8..f0a5fc32 100644
--- a/src/util/schemas/RelationshipPostSchema.ts
+++ b/src/util/schemas/RelationshipPostSchema.ts
@@ -16,6 +16,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+// TODO: pomelo?
export interface RelationshipPostSchema {
discriminator: string;
username: string;
diff --git a/src/util/schemas/responses/GuildBansResponse.ts b/src/util/schemas/responses/GuildBansResponse.ts
index 77c95a48..aa53105d 100644
--- a/src/util/schemas/responses/GuildBansResponse.ts
+++ b/src/util/schemas/responses/GuildBansResponse.ts
@@ -21,6 +21,8 @@ export interface GuildBansResponse {
user: {
username: string;
discriminator: string;
+ global_name: string;
+ display_name: string | null;
id: string;
avatar: string | null;
public_flags: number;
diff --git a/src/util/schemas/responses/GuildWidgetJsonResponse.ts b/src/util/schemas/responses/GuildWidgetJsonResponse.ts
index bd692304..60e8e7cc 100644
--- a/src/util/schemas/responses/GuildWidgetJsonResponse.ts
+++ b/src/util/schemas/responses/GuildWidgetJsonResponse.ts
@@ -30,6 +30,8 @@ export interface GuildWidgetJsonResponse {
members: {
id: string;
username: string;
+ global_name: string;
+ display_name: string | null;
discriminator: string;
avatar: string | null;
status: ClientStatus;
diff --git a/src/util/schemas/responses/UserRelationsResponse.ts b/src/util/schemas/responses/UserRelationsResponse.ts
index 808dd3d3..59db277f 100644
--- a/src/util/schemas/responses/UserRelationsResponse.ts
+++ b/src/util/schemas/responses/UserRelationsResponse.ts
@@ -19,6 +19,8 @@ import { User } from "@spacebar/util";
export type UserRelationsResponse = (Pick<User, "id"> &
Pick<User, "username"> &
+ Pick<User, "global_name"> &
+ Pick<User, "display_name"> &
Pick<User, "discriminator"> &
Pick<User, "avatar"> &
Pick<User, "public_flags">)[];
diff --git a/src/util/util/email/index.ts b/src/util/util/email/index.ts
index 619cc5c3..6d34e234 100644
--- a/src/util/util/email/index.ts
+++ b/src/util/util/email/index.ts
@@ -112,9 +112,12 @@ export const Email: {
) {
const { instanceName } = Config.get().general;
+ // TODO: pomelo: display_name should take precedence over username if pomelo is enabled. maybe we should use global_name as the username?
const replacements = [
["{instanceName}", instanceName],
["{userUsername}", user.username],
+ ["{userGlobalName}", user.global_name],
+ ["{userDisplayName}", user.display_name],
["{userDiscriminator}", user.discriminator],
["{userId}", user.id],
["{phoneNumber}", user.phone?.slice(-4)],
|