add fields for dms

This commit is contained in:
HF 2020-11-07 16:37:52 +01:00
parent 2b27a98132
commit 2161fe11a2
8 changed files with 109 additions and 33 deletions

View File

@ -160,7 +160,7 @@ const Chat = ({
</button>
<select
style={{ flexGrow: 0 }}
style={{ width: 50 }}
onChange={(evt) => {
const sel = evt.target;
setChannel(sel.options[sel.selectedIndex].value);

View File

@ -30,10 +30,12 @@ export default async function getMe(user) {
delete userdata.mailVerified;
delete userdata.mcVerified;
const channels = [...chatProvider.defaultChannels];
userdata.channels = [
...chatProvider.defaultChannels,
...userdata.channels,
];
userdata.canvases = canvases;
userdata.channels = channels;
return userdata;
}

View File

@ -20,8 +20,7 @@ class Minecraft {
user.minecraftname = minecraftname;
const reguser = await RegUser.findOne({ where: { minecraftid } });
if (reguser && reguser.mcVerified) {
user.id = reguser.id;
user.regUser = reguser;
user.setRegUser(reguser);
reguser.update({ minecraftname });
}
this.online[minecraftid] = user;
@ -86,7 +85,7 @@ class Minecraft {
if (reguser && reguser.mcVerified) {
user.id = reguser.id;
user.minecraftname = reguser.minecraftname;
user.regUser = reguser;
user.setRegUser(reguser);
} else {
user.minecraftname = minecraftid;
}
@ -110,7 +109,7 @@ class Minecraft {
RegUser.findOne({ where: { minecraftname } }).then((reguser) => {
if (reguser && reguser.mcVerified) {
user.id = reguser.id;
user.regUser = reguser;
user.setRegUser(reguser);
// this.online[reguser.minecraftid] = user;
}
});

View File

@ -35,11 +35,7 @@ passport.deserializeUser(async (req, id, done) => {
},
}).then((reguser) => {
if (reguser) {
user.regUser = reguser;
user.id = id;
for (let i = 0; i < reguser.channel.length; i += 1) {
user.channelIds.push(reguser.channel[i].id);
}
user.setRegUser(reguser);
} else {
user.id = null;
}
@ -67,7 +63,13 @@ passport.use(new JsonStrategy({
const query = (nameoremail.indexOf('@') !== -1)
? { email: nameoremail }
: { name: nameoremail };
RegUser.findOne({ where: query }).then((reguser) => {
RegUser.findOne({
include: {
model: Channel,
as: 'channel',
},
where: query,
}).then((reguser) => {
if (!reguser) {
return done(null, false, { message: 'Name or Email does not exist!' });
}
@ -75,7 +77,7 @@ passport.use(new JsonStrategy({
return done(null, false, { message: 'Incorrect password!' });
}
const user = new User(reguser.id);
user.regUser = reguser;
user.setRegUser(reguser);
user.updateLogInTimestamp();
return done(null, user);
});
@ -93,15 +95,33 @@ async function oauthLogin(email, name, discordid = null) {
throw new Error('You don\'t have a mail set in your account.');
}
name = sanitizeName(name);
let reguser = await RegUser.findOne({ where: { email } });
let reguser = await RegUser.findOne({
include: {
model: Channel,
as: 'channel',
},
where: { email },
});
if (!reguser) {
reguser = await RegUser.findOne({ where: { name } });
reguser = await RegUser.findOne({
include: {
model: Channel,
as: 'channel',
},
where: { name },
});
while (reguser) {
// name is taken by someone else
// eslint-disable-next-line max-len
name = `${name.substring(0, 15)}-${Math.random().toString(36).substring(2, 10)}`;
// eslint-disable-next-line no-await-in-loop
reguser = await RegUser.findOne({ where: { name } });
reguser = await RegUser.findOne({
include: {
model: Channel,
as: 'channel',
},
where: { name },
});
}
reguser = await RegUser.create({
email,
@ -114,7 +134,7 @@ async function oauthLogin(email, name, discordid = null) {
reguser.update({ discordid });
}
const user = new User(reguser.id);
user.regUser = reguser;
user.setRegUser(reguser);
return user;
}
@ -193,15 +213,33 @@ passport.use(new RedditStrategy({
let name = sanitizeName(profile.name);
// reddit needs an own login strategy based on its id,
// because we can not access it's mail
let reguser = await RegUser.findOne({ where: { redditid } });
let reguser = await RegUser.findOne({
include: {
model: Channel,
as: 'channel',
},
where: { redditid },
});
if (!reguser) {
reguser = await RegUser.findOne({ where: { name } });
reguser = await RegUser.findOne({
include: {
model: Channel,
as: 'channel',
},
where: { name },
});
while (reguser) {
// name is taken by someone else
// eslint-disable-next-line max-len
name = `${name.substring(0, 15)}-${Math.random().toString(36).substring(2, 10)}`;
// eslint-disable-next-line no-await-in-loop
reguser = await RegUser.findOne({ where: { name } });
reguser = await RegUser.findOne({
include: {
model: Channel,
as: 'channel',
},
where: { name },
});
}
reguser = await RegUser.create({
name,
@ -210,7 +248,7 @@ passport.use(new RedditStrategy({
});
}
const user = new User(reguser.id);
user.regUser = reguser;
user.setRegUser(reguser);
done(null, user);
} catch (err) {
done(err);

View File

@ -8,6 +8,7 @@
import DataType from 'sequelize';
import Model from '../sequelize';
import RegUser from './RegUser';
const Channel = Model.define('Channel', {
// Channel ID
@ -19,7 +20,19 @@ const Channel = Model.define('Channel', {
name: {
type: `${DataType.CHAR(32)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`,
allowNull: true,
},
/*
* 0: public channel
* 1: DM
* 2: Group (not implemented)
* 3: faction (not implemented)
*/
type: {
type: DataType.TINYINT,
allowNull: false,
defaultValue: 0,
},
lastMessage: {
@ -30,4 +43,20 @@ const Channel = Model.define('Channel', {
updatedAt: false,
});
/*
* Direct Message User id
* just set if channel is DM
* (associating it here allows us too
* keep track of users leaving and joining DMs and ending up
* in the same conversation)
*/
Channel.belongsTo(RegUser, {
as: 'dmu1',
foreignKey: 'dmu1id',
});
Channel.belongsTo(RegUser, {
as: 'dmu2',
foreignKey: 'dmu2id',
});
export default Channel;

View File

@ -23,11 +23,14 @@ class User {
ip: string;
wait: ?number;
regUser: Object;
channels: Array;
constructor(id: string = null, ip: string = '127.0.0.1') {
// id should stay null if unregistered
this.id = id;
this.ip = ip;
this.channels = [];
this.channelIds = [];
this.ipSub = getIPv6Subnet(ip);
this.wait = null;
// following gets populated by passport
@ -50,6 +53,18 @@ class User {
}
}
setRegUser(reguser) {
this.regUser = reguser;
this.id = reguser.id;
for (let i = 0; i < reguser.channel.length; i += 1) {
this.channelIds.push(reguser.channel[i].id);
this.channels.push([
reguser.channel[i].id,
reguser.channel[i].name,
]);
}
}
getName() {
return (this.regUser) ? this.regUser.name : null;
}
@ -149,6 +164,7 @@ class User {
if (this.regUser == null) {
return {
name: null,
channels: this.channels,
};
}
const { regUser } = this;
@ -163,6 +179,7 @@ class User {
dailyRanking: regUser.dailyRanking,
mailreg: !!(regUser.password),
userlvl: this.isAdmin() ? 1 : 0,
channels: this.channels,
};
}
}

View File

@ -22,15 +22,7 @@ function sync(...args) {
return sequelize.sync(...args);
}
/*
* makes sure that minimum required rows are present
*
*/
function validateTables() {
}
export default { sync, validateTables };
export default { sync };
export {
Whitelist, Blacklist, User, RegUser, Channel, UserChannel, Message,
};

View File

@ -66,8 +66,7 @@ export default async (req: Request, res: Response) => {
logger.info(`Created new user ${name} ${email} ${ip}`);
const { user } = req;
user.id = newuser.id;
user.regUser = newuser;
user.setRegUser(newuser);
const me = await getMe(user);
await req.logIn(user, (err) => {