Browse Source

my_alias and my_photo_url on tribe join or request, check existing ChatMember aliases to make sure unique

dependabot/npm_and_yarn/ini-1.3.7
Evan Feenstra 4 years ago
parent
commit
96521e43ee
  1. 32
      dist/src/controllers/chatTribes.js
  2. 2
      dist/src/controllers/chatTribes.js.map
  3. 4
      dist/src/models/ts/chatMember.js
  4. 2
      dist/src/models/ts/chatMember.js.map
  5. 43
      dist/src/network/receive.js
  6. 2
      dist/src/network/receive.js.map
  7. 2
      dist/src/network/send.js
  8. 2
      dist/src/network/send.js.map
  9. 1
      dist/src/utils/setup.js
  10. 2
      dist/src/utils/setup.js.map
  11. 32
      src/controllers/chatTribes.ts
  12. 3
      src/models/ts/chatMember.ts
  13. 43
      src/network/receive.ts
  14. 2
      src/network/send.ts
  15. 2
      src/utils/setup.ts

32
dist/src/controllers/chatTribes.js

@ -24,7 +24,7 @@ const constants_1 = require("../constants");
function joinTribe(req, res) { function joinTribe(req, res) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
console.log('=> joinTribe'); console.log('=> joinTribe');
const { uuid, group_key, name, host, amount, img, owner_pubkey, owner_alias } = req.body; const { uuid, group_key, name, host, amount, img, owner_pubkey, owner_alias, my_alias, my_photo_url } = req.body;
const is_private = req.body.private; const is_private = req.body.private;
const existing = yield models_1.models.Chat.findOne({ where: { uuid } }); const existing = yield models_1.models.Chat.findOne({ where: { uuid } });
if (existing) { if (existing) {
@ -77,6 +77,10 @@ function joinTribe(req, res) {
status: chatStatus, status: chatStatus,
priceToJoin: amount || 0, priceToJoin: amount || 0,
}; };
if (my_alias)
chatParams.myAlias = my_alias;
if (my_photo_url)
chatParams.myPhotoUrl = my_photo_url;
const typeToSend = is_private ? const typeToSend = is_private ?
constants_1.default.message_types.member_request : constants_1.default.message_types.member_request :
constants_1.default.message_types.group_join; constants_1.default.message_types.group_join;
@ -85,15 +89,19 @@ function joinTribe(req, res) {
chatParams.contactIds; chatParams.contactIds;
console.log('=> joinTribe: typeToSend', typeToSend); console.log('=> joinTribe: typeToSend', typeToSend);
console.log('=> joinTribe: contactIdsToSend', contactIdsToSend); console.log('=> joinTribe: contactIdsToSend', contactIdsToSend);
// set my alias to be the custom one
const theOwner = owner.dataValues || owner;
if (my_alias)
theOwner.alias = my_alias;
network.sendMessage({ network.sendMessage({
chat: Object.assign(Object.assign({}, chatParams), { contactIds: contactIdsToSend, members: { chat: Object.assign(Object.assign({}, chatParams), { contactIds: contactIdsToSend, members: {
[owner.publicKey]: { [owner.publicKey]: {
key: owner.contactKey, key: owner.contactKey,
alias: owner.alias || '' alias: my_alias || owner.alias || ''
} }
} }), } }),
amount: amount || 0, amount: amount || 0,
sender: owner, sender: theOwner,
message: {}, message: {},
type: typeToSend, type: typeToSend,
failure: function (e) { failure: function (e) {
@ -130,7 +138,7 @@ function receiveMemberRequest(payload) {
date.setMilliseconds(0); date.setMilliseconds(0);
let theSender = null; let theSender = null;
const member = chat_members[sender_pub_key]; const member = chat_members[sender_pub_key];
const senderAlias = sender_alias || (member && member.alias) || 'Unknown'; const senderAlias = (member && member.alias) || sender_alias || 'Unknown';
const sender = yield models_1.models.Contact.findOne({ where: { publicKey: sender_pub_key } }); const sender = yield models_1.models.Contact.findOne({ where: { publicKey: sender_pub_key } });
if (sender) { if (sender) {
theSender = sender; // might already include?? theSender = sender; // might already include??
@ -140,7 +148,7 @@ function receiveMemberRequest(payload) {
const createdContact = yield models_1.models.Contact.create({ const createdContact = yield models_1.models.Contact.create({
publicKey: sender_pub_key, publicKey: sender_pub_key,
contactKey: member.key, contactKey: member.key,
alias: senderAlias, alias: sender_alias || senderAlias,
status: 1, status: 1,
fromGroup: true, fromGroup: true,
photoUrl: sender_photo_url photoUrl: sender_photo_url
@ -156,6 +164,7 @@ function receiveMemberRequest(payload) {
role: constants_1.default.chat_roles.reader, role: constants_1.default.chat_roles.reader,
status: constants_1.default.chat_statuses.pending, status: constants_1.default.chat_statuses.pending,
lastActive: date, lastActive: date,
lastAlias: senderAlias,
}); });
// maybe check here manually???? // maybe check here manually????
try { try {
@ -165,6 +174,7 @@ function receiveMemberRequest(payload) {
role: constants_1.default.chat_roles.reader, role: constants_1.default.chat_roles.reader,
status: constants_1.default.chat_statuses.pending, status: constants_1.default.chat_statuses.pending,
lastActive: date, lastActive: date,
lastAlias: senderAlias,
}); });
} }
catch (e) { } catch (e) { }
@ -178,7 +188,7 @@ function receiveMemberRequest(payload) {
network_type network_type
}; };
if (isTribe) { if (isTribe) {
msg.senderAlias = sender_alias; msg.senderAlias = senderAlias;
msg.senderPic = sender_photo_url; msg.senderPic = sender_photo_url;
} }
const message = yield models_1.models.Message.create(msg); const message = yield models_1.models.Message.create(msg);
@ -316,7 +326,7 @@ function approveOrRejectMember(req, res) {
exports.approveOrRejectMember = approveOrRejectMember; exports.approveOrRejectMember = approveOrRejectMember;
function receiveMemberApprove(payload) { function receiveMemberApprove(payload) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
console.log('=> receiveMemberApprove'); console.log('=> receiveMemberApprove'); // received by the joiner only
const { owner, chat, chat_name, sender, network_type } = yield helpers.parseReceiveParams(payload); const { owner, chat, chat_name, sender, network_type } = yield helpers.parseReceiveParams(payload);
if (!chat) if (!chat)
return console.log('no chat'); return console.log('no chat');
@ -342,16 +352,20 @@ function receiveMemberApprove(payload) {
}); });
const amount = chat.priceToJoin || 0; const amount = chat.priceToJoin || 0;
const theChat = chat.dataValues || chat; const theChat = chat.dataValues || chat;
const theOwner = owner.dataValues || owner;
const theAlias = chat.myAlias || owner.alias;
if (theAlias)
theOwner.alias = theAlias;
// send JOIN and my info to all // send JOIN and my info to all
network.sendMessage({ network.sendMessage({
chat: Object.assign(Object.assign({}, theChat), { members: { chat: Object.assign(Object.assign({}, theChat), { members: {
[owner.publicKey]: { [owner.publicKey]: {
key: owner.contactKey, key: owner.contactKey,
alias: owner.alias || '' alias: theAlias || ''
} }
} }), } }),
amount, amount,
sender: owner, sender: theOwner,
message: {}, message: {},
type: constants_1.default.message_types.group_join, type: constants_1.default.message_types.group_join,
}); });

2
dist/src/controllers/chatTribes.js.map

File diff suppressed because one or more lines are too long

4
dist/src/models/ts/chatMember.js

@ -40,6 +40,10 @@ __decorate([
sequelize_typescript_1.Column, sequelize_typescript_1.Column,
__metadata("design:type", Number) __metadata("design:type", Number)
], ChatMember.prototype, "status", void 0); ], ChatMember.prototype, "status", void 0);
__decorate([
sequelize_typescript_1.Column,
__metadata("design:type", String)
], ChatMember.prototype, "lastAlias", void 0);
ChatMember = __decorate([ ChatMember = __decorate([
sequelize_typescript_1.Table({ tableName: 'sphinx_chat_members', underscored: true, indexes: [ sequelize_typescript_1.Table({ tableName: 'sphinx_chat_members', underscored: true, indexes: [
{ unique: true, fields: ['chat_id', 'contact_id'] } { unique: true, fields: ['chat_id', 'contact_id'] }

2
dist/src/models/ts/chatMember.js.map

@ -1 +1 @@
{"version":3,"file":"chatMember.js","sourceRoot":"","sources":["../../../../src/models/ts/chatMember.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+DAA4D;AAK5D,IAAqB,UAAU,GAA/B,MAAqB,UAAW,SAAQ,4BAAiB;CAuBxD,CAAA;AApBC;IADC,6BAAM;;0CACO;AAGd;IADC,6BAAM;;6CACU;AAGjB;IADC,6BAAM;;wCACK;AAGZ;IADC,6BAAM;;8CACW;AAGlB;IADC,6BAAM;;iDACc;AAGrB;IADC,6BAAM;8BACK,IAAI;8CAAA;AAGhB;IADC,6BAAM;;0CACO;AArBK,UAAU;IAH9B,4BAAK,CAAC,EAAC,SAAS,EAAE,qBAAqB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAC;YACnE,EAAC,MAAM,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC,SAAS,EAAC,YAAY,CAAC,EAAC;SAC/C,EAAC,CAAC;GACkB,UAAU,CAuB9B;kBAvBoB,UAAU"} {"version":3,"file":"chatMember.js","sourceRoot":"","sources":["../../../../src/models/ts/chatMember.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+DAA4D;AAK5D,IAAqB,UAAU,GAA/B,MAAqB,UAAW,SAAQ,4BAAiB;CA0BxD,CAAA;AAvBC;IADC,6BAAM;;0CACO;AAGd;IADC,6BAAM;;6CACU;AAGjB;IADC,6BAAM;;wCACK;AAGZ;IADC,6BAAM;;8CACW;AAGlB;IADC,6BAAM;;iDACc;AAGrB;IADC,6BAAM;8BACK,IAAI;8CAAA;AAGhB;IADC,6BAAM;;0CACO;AAGd;IADC,6BAAM;;6CACU;AAxBE,UAAU;IAH9B,4BAAK,CAAC,EAAC,SAAS,EAAE,qBAAqB,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAC;YACnE,EAAC,MAAM,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC,SAAS,EAAC,YAAY,CAAC,EAAC;SAC/C,EAAC,CAAC;GACkB,UAAU,CA0B9B;kBA1BoB,UAAU"}

43
dist/src/network/receive.js

@ -93,8 +93,11 @@ function onReceive(payload) {
const needsPricePerMessage = typesThatNeedPricePerMessage.includes(payload.type); const needsPricePerMessage = typesThatNeedPricePerMessage.includes(payload.type);
// CHECK THEY ARE IN THE GROUP if message // CHECK THEY ARE IN THE GROUP if message
const senderContact = yield models_1.models.Contact.findOne({ where: { publicKey: payload.sender.pub_key } }); const senderContact = yield models_1.models.Contact.findOne({ where: { publicKey: payload.sender.pub_key } });
if (!senderContact)
return; // need sender contact!
const senderContactId = senderContact.id;
if (needsPricePerMessage) { if (needsPricePerMessage) {
const senderMember = senderContact && (yield models_1.models.ChatMember.findOne({ where: { contactId: senderContact.id, chatId: chat.id } })); const senderMember = yield models_1.models.ChatMember.findOne({ where: { contactId: senderContactId, chatId: chat.id } });
if (!senderMember) if (!senderMember)
doAction = false; doAction = false;
} }
@ -107,7 +110,7 @@ function onReceive(payload) {
timers.addTimer({ timers.addTimer({
amount: chat.escrowAmount, amount: chat.escrowAmount,
millis: chat.escrowMillis, millis: chat.escrowMillis,
receiver: senderContact.id, receiver: senderContactId,
msgId: payload.message.id, msgId: payload.message.id,
chatId: chat.id, chatId: chat.id,
}); });
@ -118,7 +121,7 @@ function onReceive(payload) {
if (payload.message.amount < chat.priceToJoin) if (payload.message.amount < chat.priceToJoin)
doAction = false; doAction = false;
if (chat.private) { // check if has been approved if (chat.private) { // check if has been approved
const senderMember = senderContact && (yield models_1.models.ChatMember.findOne({ where: { contactId: senderContact.id, chatId: chat.id } })); const senderMember = yield models_1.models.ChatMember.findOne({ where: { contactId: senderContactId, chatId: chat.id } });
if (!(senderMember && senderMember.status === constants_1.default.chat_statuses.approved)) { if (!(senderMember && senderMember.status === constants_1.default.chat_statuses.approved)) {
doAction = false; // dont let if private and not approved doAction = false; // dont let if private and not approved
} }
@ -130,7 +133,7 @@ function onReceive(payload) {
if (payload.message.uuid) { if (payload.message.uuid) {
const ogMsg = yield models_1.models.Message.findOne({ where: { const ogMsg = yield models_1.models.Message.findOne({ where: {
uuid: payload.message.uuid, uuid: payload.message.uuid,
sender: senderContact.id, sender: senderContactId,
} }); } });
if (ogMsg) if (ogMsg)
doAction = true; doAction = true;
@ -214,6 +217,9 @@ function forwardMessageToTribe(ogpayload, sender, realSatsContactId, amtToForwar
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
// console.log('forwardMessageToTribe') // console.log('forwardMessageToTribe')
const chat = yield models_1.models.Chat.findOne({ where: { uuid: ogpayload.chat.uuid } }); const chat = yield models_1.models.Chat.findOne({ where: { uuid: ogpayload.chat.uuid } });
if (!chat)
return;
const senderContactId = sender.id; // og msg sender
let payload; let payload;
if (sender && typesToModify.includes(ogpayload.type)) { if (sender && typesToModify.includes(ogpayload.type)) {
payload = yield modify_1.modifyPayloadAndSaveMediaKey(ogpayload, chat, sender); payload = yield modify_1.modifyPayloadAndSaveMediaKey(ogpayload, chat, sender);
@ -221,16 +227,32 @@ function forwardMessageToTribe(ogpayload, sender, realSatsContactId, amtToForwar
else { else {
payload = ogpayload; payload = ogpayload;
} }
// dont need sender beyond here
//const sender = await models.Contact.findOne({where:{publicKey:payload.sender.pub_key}})
const owner = yield models_1.models.Contact.findOne({ where: { isOwner: true } }); const owner = yield models_1.models.Contact.findOne({ where: { isOwner: true } });
const type = payload.type; const type = payload.type;
const message = payload.message; const message = payload.message;
// HERE: NEED TO MAKE SURE ALIAS IS UNIQUE // HERE: NEED TO MAKE SURE ALIAS IS UNIQUE
// ASK xref TABLE and put alias there too? // ASK xref TABLE and put alias there too?
const owner_alias = chat.myAlias || owner.alias;
const sender_alias = payload.sender && payload.sender.alias;
let final_sender_alias = sender_alias;
const chatMembers = yield models_1.models.ChatMember.findAll({ where: { chatId: chat.id } });
if (!(chatMembers && chatMembers.length))
return;
asyncForEach(chatMembers, (cm) => {
if (cm.contactId === senderContactId)
return; // dont check against self of course
if (sender_alias === cm.lastAlias || sender_alias === owner_alias) {
// impersonating! switch it up!
final_sender_alias = `${sender_alias}_2`;
}
});
if (sender_alias !== final_sender_alias) {
const theChatMember = yield models_1.models.ChatMember.findOne({ where: { chatId: chat.id, contactId: senderContactId } });
yield theChatMember.update({ lastAlias: final_sender_alias });
}
send_1.sendMessage({ send_1.sendMessage({
type, message, type, message,
sender: Object.assign(Object.assign({}, owner.dataValues), { alias: (payload.sender && payload.sender.alias) || '', photoUrl: (payload.sender && payload.sender.photo_url) || '', role: constants_1.default.chat_roles.reader }), sender: Object.assign(Object.assign({}, owner.dataValues), { alias: final_sender_alias || '', photoUrl: (payload.sender && payload.sender.photo_url) || '', role: constants_1.default.chat_roles.reader }),
amount: amtToForwardToRealSatsContactId || 0, amount: amtToForwardToRealSatsContactId || 0,
chat: chat, chat: chat,
skipPubKey: payload.sender.pub_key, skipPubKey: payload.sender.pub_key,
@ -418,4 +440,11 @@ function weave(p) {
return payload; return payload;
} }
} }
function asyncForEach(array, callback) {
return __awaiter(this, void 0, void 0, function* () {
for (let index = 0; index < array.length; index++) {
yield callback(array[index], index, array);
}
});
}
//# sourceMappingURL=receive.js.map //# sourceMappingURL=receive.js.map

2
dist/src/network/receive.js.map

File diff suppressed because one or more lines are too long

2
dist/src/network/send.js

@ -107,7 +107,7 @@ function sendMessage(params) {
console.log("KEYSEND ERROR", e); console.log("KEYSEND ERROR", e);
no = e; no = e;
} }
yield sleep(2); yield sleep(10);
})); }));
if (no) { if (no) {
if (failure) if (failure)

2
dist/src/network/send.js.map

File diff suppressed because one or more lines are too long

1
dist/src/utils/setup.js

@ -49,6 +49,7 @@ function setVersion() {
} }
function migrate() { function migrate() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
addTableColumn('sphinx_chat_members', 'last_alias');
addTableColumn('sphinx_chats', 'my_photo_url'); addTableColumn('sphinx_chats', 'my_photo_url');
addTableColumn('sphinx_chats', 'my_alias'); addTableColumn('sphinx_chats', 'my_alias');
addTableColumn('sphinx_messages', 'sender_pic'); addTableColumn('sphinx_messages', 'sender_pic');

2
dist/src/utils/setup.js.map

File diff suppressed because one or more lines are too long

32
src/controllers/chatTribes.ts

@ -13,7 +13,7 @@ import constants from '../constants'
export async function joinTribe(req, res){ export async function joinTribe(req, res){
console.log('=> joinTribe') console.log('=> joinTribe')
const { uuid, group_key, name, host, amount, img, owner_pubkey, owner_alias } = req.body const { uuid, group_key, name, host, amount, img, owner_pubkey, owner_alias, my_alias, my_photo_url } = req.body
const is_private = req.body.private const is_private = req.body.private
const existing = await models.Chat.findOne({where:{uuid}}) const existing = await models.Chat.findOne({where:{uuid}})
@ -56,7 +56,7 @@ export async function joinTribe(req, res){
const chatStatus = is_private ? const chatStatus = is_private ?
constants.chat_statuses.pending : constants.chat_statuses.pending :
constants.chat_statuses.approved constants.chat_statuses.approved
const chatParams = { const chatParams:{[k:string]:any} = {
uuid: uuid, uuid: uuid,
contactIds: JSON.stringify(contactIds), contactIds: JSON.stringify(contactIds),
photoUrl: img||'', photoUrl: img||'',
@ -71,6 +71,8 @@ export async function joinTribe(req, res){
status: chatStatus, status: chatStatus,
priceToJoin: amount||0, priceToJoin: amount||0,
} }
if(my_alias) chatParams.myAlias = my_alias
if(my_photo_url) chatParams.myPhotoUrl = my_photo_url
const typeToSend = is_private ? const typeToSend = is_private ?
constants.message_types.member_request : constants.message_types.member_request :
@ -80,6 +82,9 @@ export async function joinTribe(req, res){
chatParams.contactIds chatParams.contactIds
console.log('=> joinTribe: typeToSend', typeToSend) console.log('=> joinTribe: typeToSend', typeToSend)
console.log('=> joinTribe: contactIdsToSend', contactIdsToSend) console.log('=> joinTribe: contactIdsToSend', contactIdsToSend)
// set my alias to be the custom one
const theOwner = owner.dataValues||owner
if(my_alias) theOwner.alias = my_alias
network.sendMessage({ // send my data to tribe owner network.sendMessage({ // send my data to tribe owner
chat: { chat: {
...chatParams, ...chatParams,
@ -87,12 +92,12 @@ export async function joinTribe(req, res){
members: { members: {
[owner.publicKey]: { [owner.publicKey]: {
key: owner.contactKey, key: owner.contactKey,
alias: owner.alias||'' alias: my_alias||owner.alias||''
} }
} }
}, },
amount:amount||0, amount: amount||0,
sender: owner, sender: theOwner,
message: {}, message: {},
type: typeToSend, type: typeToSend,
failure: function (e) { failure: function (e) {
@ -127,7 +132,7 @@ export async function receiveMemberRequest(payload) {
let theSender: any = null let theSender: any = null
const member = chat_members[sender_pub_key] const member = chat_members[sender_pub_key]
const senderAlias = sender_alias || (member && member.alias) || 'Unknown' const senderAlias = (member && member.alias) || sender_alias || 'Unknown'
const sender = await models.Contact.findOne({ where: { publicKey: sender_pub_key } }) const sender = await models.Contact.findOne({ where: { publicKey: sender_pub_key } })
if (sender) { if (sender) {
@ -137,7 +142,7 @@ export async function receiveMemberRequest(payload) {
const createdContact = await models.Contact.create({ const createdContact = await models.Contact.create({
publicKey: sender_pub_key, publicKey: sender_pub_key,
contactKey: member.key, contactKey: member.key,
alias: senderAlias, alias: sender_alias || senderAlias,
status: 1, status: 1,
fromGroup: true, fromGroup: true,
photoUrl: sender_photo_url photoUrl: sender_photo_url
@ -153,6 +158,7 @@ export async function receiveMemberRequest(payload) {
role: constants.chat_roles.reader, role: constants.chat_roles.reader,
status: constants.chat_statuses.pending, status: constants.chat_statuses.pending,
lastActive: date, lastActive: date,
lastAlias: senderAlias,
}) })
// maybe check here manually???? // maybe check here manually????
try{ try{
@ -162,6 +168,7 @@ export async function receiveMemberRequest(payload) {
role: constants.chat_roles.reader, role: constants.chat_roles.reader,
status: constants.chat_statuses.pending, status: constants.chat_statuses.pending,
lastActive: date, lastActive: date,
lastAlias: senderAlias,
}) })
} catch(e){} } catch(e){}
@ -175,7 +182,7 @@ export async function receiveMemberRequest(payload) {
network_type network_type
} }
if(isTribe) { if(isTribe) {
msg.senderAlias = sender_alias msg.senderAlias = senderAlias
msg.senderPic = sender_photo_url msg.senderPic = sender_photo_url
} }
const message = await models.Message.create(msg) const message = await models.Message.create(msg)
@ -318,7 +325,7 @@ export async function approveOrRejectMember(req,res) {
} }
export async function receiveMemberApprove(payload) { export async function receiveMemberApprove(payload) {
console.log('=> receiveMemberApprove') console.log('=> receiveMemberApprove') // received by the joiner only
const { owner, chat, chat_name, sender, network_type } = await helpers.parseReceiveParams(payload) const { owner, chat, chat_name, sender, network_type } = await helpers.parseReceiveParams(payload)
if(!chat) return console.log('no chat') if(!chat) return console.log('no chat')
await chat.update({status: constants.chat_statuses.approved}) await chat.update({status: constants.chat_statuses.approved})
@ -345,18 +352,21 @@ export async function receiveMemberApprove(payload) {
const amount = chat.priceToJoin||0 const amount = chat.priceToJoin||0
const theChat = chat.dataValues||chat const theChat = chat.dataValues||chat
const theOwner = owner.dataValues||owner
const theAlias = chat.myAlias || owner.alias
if(theAlias) theOwner.alias = theAlias
// send JOIN and my info to all // send JOIN and my info to all
network.sendMessage({ network.sendMessage({
chat: { ...theChat, chat: { ...theChat,
members: { members: {
[owner.publicKey]: { [owner.publicKey]: {
key: owner.contactKey, key: owner.contactKey,
alias: owner.alias||'' alias: theAlias||''
} }
} }
}, },
amount, amount,
sender: owner, sender: theOwner,
message: {}, message: {},
type: constants.message_types.group_join, type: constants.message_types.group_join,
}) })

3
src/models/ts/chatMember.ts

@ -26,4 +26,7 @@ export default class ChatMember extends Model<ChatMember> {
@Column @Column
status: number status: number
@Column
lastAlias: string
} }

43
src/network/receive.ts

@ -83,8 +83,10 @@ async function onReceive(payload){
const needsPricePerMessage = typesThatNeedPricePerMessage.includes(payload.type) const needsPricePerMessage = typesThatNeedPricePerMessage.includes(payload.type)
// CHECK THEY ARE IN THE GROUP if message // CHECK THEY ARE IN THE GROUP if message
const senderContact = await models.Contact.findOne({where:{publicKey:payload.sender.pub_key}}) const senderContact = await models.Contact.findOne({where:{publicKey:payload.sender.pub_key}})
if(!senderContact) return // need sender contact!
const senderContactId = senderContact.id
if(needsPricePerMessage) { if(needsPricePerMessage) {
const senderMember = senderContact && await models.ChatMember.findOne({where:{contactId:senderContact.id, chatId:chat.id}}) const senderMember = await models.ChatMember.findOne({where:{contactId:senderContactId, chatId:chat.id}})
if(!senderMember) doAction=false if(!senderMember) doAction=false
} }
// CHECK PRICES // CHECK PRICES
@ -96,7 +98,7 @@ async function onReceive(payload){
timers.addTimer({ // pay them back timers.addTimer({ // pay them back
amount: chat.escrowAmount, amount: chat.escrowAmount,
millis:chat.escrowMillis, millis:chat.escrowMillis,
receiver: senderContact.id, receiver: senderContactId,
msgId: payload.message.id, msgId: payload.message.id,
chatId: chat.id, chatId: chat.id,
}) })
@ -106,7 +108,7 @@ async function onReceive(payload){
if(payload.type===msgtypes.group_join) { if(payload.type===msgtypes.group_join) {
if(payload.message.amount<chat.priceToJoin) doAction=false if(payload.message.amount<chat.priceToJoin) doAction=false
if(chat.private) { // check if has been approved if(chat.private) { // check if has been approved
const senderMember = senderContact && await models.ChatMember.findOne({where:{contactId:senderContact.id, chatId:chat.id}}) const senderMember = await models.ChatMember.findOne({where:{contactId:senderContactId, chatId:chat.id}})
if(!(senderMember && senderMember.status===constants.chat_statuses.approved)){ if(!(senderMember && senderMember.status===constants.chat_statuses.approved)){
doAction=false // dont let if private and not approved doAction=false // dont let if private and not approved
} }
@ -118,7 +120,7 @@ async function onReceive(payload){
if(payload.message.uuid) { if(payload.message.uuid) {
const ogMsg = await models.Message.findOne({where:{ const ogMsg = await models.Message.findOne({where:{
uuid: payload.message.uuid, uuid: payload.message.uuid,
sender: senderContact.id, sender: senderContactId,
}}) }})
if(ogMsg) doAction = true if(ogMsg) doAction = true
} }
@ -194,6 +196,9 @@ async function doTheAction(data){
async function forwardMessageToTribe(ogpayload, sender, realSatsContactId, amtToForwardToRealSatsContactId){ async function forwardMessageToTribe(ogpayload, sender, realSatsContactId, amtToForwardToRealSatsContactId){
// console.log('forwardMessageToTribe') // console.log('forwardMessageToTribe')
const chat = await models.Chat.findOne({where:{uuid:ogpayload.chat.uuid}}) const chat = await models.Chat.findOne({where:{uuid:ogpayload.chat.uuid}})
if(!chat) return
const senderContactId = sender.id // og msg sender
let payload let payload
if(sender && typesToModify.includes(ogpayload.type)){ if(sender && typesToModify.includes(ogpayload.type)){
@ -201,25 +206,41 @@ async function forwardMessageToTribe(ogpayload, sender, realSatsContactId, amtTo
} else { } else {
payload = ogpayload payload = ogpayload
} }
// dont need sender beyond here
//const sender = await models.Contact.findOne({where:{publicKey:payload.sender.pub_key}})
const owner = await models.Contact.findOne({where:{isOwner:true}}) const owner = await models.Contact.findOne({where:{isOwner:true}})
const type = payload.type const type = payload.type
const message = payload.message const message = payload.message
// HERE: NEED TO MAKE SURE ALIAS IS UNIQUE // HERE: NEED TO MAKE SURE ALIAS IS UNIQUE
// ASK xref TABLE and put alias there too? // ASK xref TABLE and put alias there too?
const owner_alias = chat.myAlias || owner.alias
const sender_alias = payload.sender&&payload.sender.alias
let final_sender_alias = sender_alias
const chatMembers = await models.ChatMember.findAll({where:{chatId:chat.id}})
if(!(chatMembers && chatMembers.length)) return
asyncForEach(chatMembers, (cm)=>{
if(cm.contactId===senderContactId) return // dont check against self of course
if(sender_alias===cm.lastAlias || sender_alias===owner_alias) {
// impersonating! switch it up!
final_sender_alias = `${sender_alias}_2`
}
})
if(sender_alias!==final_sender_alias) {
const theChatMember = await models.ChatMember.findOne({where:{chatId:chat.id,contactId:senderContactId}})
await theChatMember.update({lastAlias:final_sender_alias})
}
sendMessage({ sendMessage({
type, message, type, message,
sender: { sender: {
...owner.dataValues, ...owner.dataValues,
alias: (payload.sender&&payload.sender.alias) || '', alias: final_sender_alias || '',
photoUrl: (payload.sender&&payload.sender.photo_url) || '', photoUrl: (payload.sender&&payload.sender.photo_url) || '',
role: constants.chat_roles.reader, role: constants.chat_roles.reader,
}, },
amount: amtToForwardToRealSatsContactId||0, amount: amtToForwardToRealSatsContactId||0,
chat: chat, chat: chat,
skipPubKey: payload.sender.pub_key, skipPubKey: payload.sender.pub_key, // dont forward back to self
realSatsContactId, realSatsContactId,
success: ()=>{}, success: ()=>{},
receive: ()=>{}, receive: ()=>{},
@ -386,3 +407,9 @@ function weave(p){
return payload return payload
} }
} }
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}

2
src/network/send.ts

@ -105,7 +105,7 @@ export async function sendMessage(params) {
console.log("KEYSEND ERROR", e) console.log("KEYSEND ERROR", e)
no = e no = e
} }
await sleep(2) await sleep(10)
}) })
if(no){ if(no){
if(failure) failure(no) if(failure) failure(no)

2
src/utils/setup.ts

@ -38,6 +38,8 @@ async function setVersion() {
async function migrate() { async function migrate() {
addTableColumn('sphinx_chat_members', 'last_alias')
addTableColumn('sphinx_chats', 'my_photo_url') addTableColumn('sphinx_chats', 'my_photo_url')
addTableColumn('sphinx_chats', 'my_alias') addTableColumn('sphinx_chats', 'my_alias')

Loading…
Cancel
Save