1
0
Fork 0

Handle user creation for Clyde AI

This commit is contained in:
Cadence Ember 2023-11-25 22:26:26 +13:00
parent fa68b877f6
commit b9ec28a5ad
3 changed files with 32 additions and 3 deletions

View file

@ -5,6 +5,10 @@ const assert = require("assert")
const passthrough = require("../../passthrough") const passthrough = require("../../passthrough")
const {select} = passthrough const {select} = passthrough
const SPECIAL_USER_MAPPINGS = new Map([
["1081004946872352958", ["clyde_ai", "clyde"]]
])
/** /**
* Downcased and stripped username. Can only include a basic set of characters. * Downcased and stripped username. Can only include a basic set of characters.
* https://spec.matrix.org/v1.6/appendices/#user-identifiers * https://spec.matrix.org/v1.6/appendices/#user-identifiers
@ -30,7 +34,7 @@ function downcaseUsername(user) {
/** @param {string[]} preferences */ /** @param {string[]} preferences */
function* generateLocalpartAlternatives(preferences) { function* generateLocalpartAlternatives(preferences) {
const best = preferences[0] const best = preferences[0]
assert.ok(best) assert(best)
// First, suggest the preferences... // First, suggest the preferences...
for (const localpart of preferences) { for (const localpart of preferences) {
yield localpart yield localpart
@ -50,15 +54,18 @@ function* generateLocalpartAlternatives(preferences) {
* @returns {string} * @returns {string}
*/ */
function userToSimName(user) { function userToSimName(user) {
assert.notEqual(user.discriminator, "0000", "cannot create user for a webhook") if (!SPECIAL_USER_MAPPINGS.has(user.id)) { // skip this check for known special users
assert.notEqual(user.discriminator, "0000", `cannot create user for a webhook: ${JSON.stringify(user)}`)
}
// 1. Is sim user already registered? // 1. Is sim user already registered?
const existing = select("sim", "sim_name", {user_id: user.id}).pluck().get() const existing = select("sim", "sim_name", {user_id: user.id}).pluck().get()
if (existing) return existing if (existing) return existing
// 2. Register based on username (could be new or old format) // 2. Register based on username (could be new or old format)
// (Unless it's a special user, in which case copy their provided mappings.)
const downcased = downcaseUsername(user) const downcased = downcaseUsername(user)
const preferences = [downcased] const preferences = SPECIAL_USER_MAPPINGS.get(user.id) || [downcased]
if (user.discriminator.length === 4) { // Old style tag? If user.username is unavailable, try the full tag next if (user.discriminator.length === 4) { // Old style tag? If user.username is unavailable, try the full tag next
preferences.push(downcased + user.discriminator) preferences.push(downcased + user.discriminator)
} }

View file

@ -1,6 +1,7 @@
const {test} = require("supertape") const {test} = require("supertape")
const tryToCatch = require("try-to-catch") const tryToCatch = require("try-to-catch")
const assert = require("assert") const assert = require("assert")
const data = require("../../test/data")
const {userToSimName} = require("./user-to-mxid") const {userToSimName} = require("./user-to-mxid")
test("user2name: cannot create user for a webhook", async t => { test("user2name: cannot create user for a webhook", async t => {
@ -39,3 +40,7 @@ test("user2name: uses ID if name becomes too short", t => {
test("user2name: uses ID when name has only disallowed characters", t => { test("user2name: uses ID when name has only disallowed characters", t => {
t.equal(userToSimName({username: "!@#$%^&*", discriminator: "0001", id: "9"}), "9") t.equal(userToSimName({username: "!@#$%^&*", discriminator: "0001", id: "9"}), "9")
}) })
test("user2name: works on special user", t => {
t.equal(userToSimName(data.user.clyde_ai), "clyde_ai")
})

View file

@ -183,6 +183,23 @@ module.exports = {
safety_alerts_channel_id: null safety_alerts_channel_id: null
} }
}, },
user: {
clyde_ai: {
id: "1081004946872352958",
username: "clyde",
avatar: "a_6170487d32fdfe9f988720ad80e6ab8c",
discriminator: "0000",
public_flags: 0,
premium_type: 2,
flags: 0,
bot: true,
banner: null,
accent_color: null,
global_name: "Clyde",
avatar_decoration_data: null,
banner_color: null
}
},
member: { member: {
kumaccino: { kumaccino: {
avatar: null, avatar: null,