Handle user creation for Clyde AI
This commit is contained in:
parent
fa68b877f6
commit
b9ec28a5ad
3 changed files with 32 additions and 3 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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")
|
||||||
|
})
|
||||||
|
|
17
test/data.js
17
test/data.js
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue