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> </button>
<select <select
style={{ flexGrow: 0 }} style={{ width: 50 }}
onChange={(evt) => { onChange={(evt) => {
const sel = evt.target; const sel = evt.target;
setChannel(sel.options[sel.selectedIndex].value); setChannel(sel.options[sel.selectedIndex].value);

View File

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

View File

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

View File

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

View File

@ -8,6 +8,7 @@
import DataType from 'sequelize'; import DataType from 'sequelize';
import Model from '../sequelize'; import Model from '../sequelize';
import RegUser from './RegUser';
const Channel = Model.define('Channel', { const Channel = Model.define('Channel', {
// Channel ID // Channel ID
@ -19,7 +20,19 @@ const Channel = Model.define('Channel', {
name: { name: {
type: `${DataType.CHAR(32)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`, 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, allowNull: false,
defaultValue: 0,
}, },
lastMessage: { lastMessage: {
@ -30,4 +43,20 @@ const Channel = Model.define('Channel', {
updatedAt: false, 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; export default Channel;

View File

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

View File

@ -22,15 +22,7 @@ function sync(...args) {
return sequelize.sync(...args); return sequelize.sync(...args);
} }
/* export default { sync };
* makes sure that minimum required rows are present
*
*/
function validateTables() {
}
export default { sync, validateTables };
export { export {
Whitelist, Blacklist, User, RegUser, Channel, UserChannel, Message, 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}`); logger.info(`Created new user ${name} ${email} ${ip}`);
const { user } = req; const { user } = req;
user.id = newuser.id; user.setRegUser(newuser);
user.regUser = newuser;
const me = await getMe(user); const me = await getMe(user);
await req.logIn(user, (err) => { await req.logIn(user, (err) => {