Skip to content

Commit 8470d5f

Browse files
author
Jeff Yanta
committed
More refactors of chat stuff
1 parent 5f39c72 commit 8470d5f

File tree

4 files changed

+104
-108
lines changed

4 files changed

+104
-108
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ require (
66
firebase.google.com/go/v4 v4.8.0
77
github.com/aws/aws-sdk-go-v2 v0.17.0
88
github.com/bits-and-blooms/bloom/v3 v3.1.0
9-
github.com/code-payments/code-protobuf-api v1.16.7-0.20240618171829-bb587a7f24ce
9+
github.com/code-payments/code-protobuf-api v1.16.7-0.20240619134635-bde7104d4467
1010
github.com/emirpasic/gods v1.12.0
1111
github.com/envoyproxy/protoc-gen-validate v1.0.4
1212
github.com/golang-jwt/jwt/v5 v5.0.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH
121121
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
122122
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
123123
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
124-
github.com/code-payments/code-protobuf-api v1.16.7-0.20240618171829-bb587a7f24ce h1:wdPvuDHfEmymPn4zSaVD2ymK4pRKHlegAhTnl52d/IY=
125-
github.com/code-payments/code-protobuf-api v1.16.7-0.20240618171829-bb587a7f24ce/go.mod h1:pHQm75vydD6Cm2qHAzlimW6drysm489Z4tVxC2zHSsU=
124+
github.com/code-payments/code-protobuf-api v1.16.7-0.20240619134635-bde7104d4467 h1:BQgr91ASdCdxs8loz54TzmZQ0e6gDk1T7pkQxChJpdg=
125+
github.com/code-payments/code-protobuf-api v1.16.7-0.20240619134635-bde7104d4467/go.mod h1:pHQm75vydD6Cm2qHAzlimW6drysm489Z4tVxC2zHSsU=
126126
github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 h1:NmTXa/uVnDyp0TY5MKi197+3HWcnYWfnHGyaFthlnGw=
127127
github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
128128
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=

pkg/code/server/grpc/chat/v2/server.go

Lines changed: 96 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -767,33 +767,15 @@ func (s *server) SendMessage(ctx context.Context, req *chatpb.SendMessageRequest
767767
chatLock.Lock()
768768
defer chatLock.Unlock()
769769

770-
messageId := chat.GenerateMessageId()
771-
ts, _ := messageId.GetTimestamp()
772-
773-
chatMessage := &chatpb.ChatMessage{
774-
MessageId: messageId.ToProto(),
775-
SenderId: req.MemberId,
776-
Content: req.Content,
777-
Ts: timestamppb.New(ts),
778-
Cursor: &chatpb.Cursor{Value: messageId[:]},
779-
}
770+
chatMessage := newProtoChatMessage(memberId, req.Content...)
780771

781772
err = s.persistChatMessage(ctx, chatId, chatMessage)
782773
if err != nil {
783774
log.WithError(err).Warn("failure persisting chat message")
784775
return nil, status.Error(codes.Internal, "")
785776
}
786777

787-
event := &chatpb.ChatStreamEvent{
788-
Type: &chatpb.ChatStreamEvent_Message{
789-
Message: chatMessage,
790-
},
791-
}
792-
if err := s.asyncNotifyAll(chatId, memberId, event); err != nil {
793-
log.WithError(err).Warn("failure notifying chat event")
794-
}
795-
796-
// todo: send the push
778+
s.onPersistChatMessage(log, chatId, chatMessage)
797779

798780
return &chatpb.SendMessageResponse{
799781
Result: chatpb.SendMessageResponse_OK,
@@ -946,7 +928,7 @@ func (s *server) AdvancePointer(ctx context.Context, req *chatpb.AdvancePointerR
946928
Pointer: req.Pointer,
947929
},
948930
}
949-
if err := s.asyncNotifyAll(chatId, memberId, event); err != nil {
931+
if err := s.asyncNotifyAll(chatId, event); err != nil {
950932
log.WithError(err).Warn("failure notifying chat event")
951933
}
952934
}
@@ -1061,20 +1043,17 @@ func (s *server) RevealIdentity(ctx context.Context, req *chatpb.RevealIdentityR
10611043
chatLock.Lock()
10621044
defer chatLock.Unlock()
10631045

1064-
messageId := chat.GenerateMessageId()
1065-
ts, _ := messageId.GetTimestamp()
1066-
1067-
chatMessage := &chatpb.ChatMessage{
1068-
MessageId: messageId.ToProto(),
1069-
SenderId: req.MemberId,
1070-
Content: []*chatpb.Content{
1071-
{
1072-
Type: &chatpb.Content_IdentityRevealed{},
1046+
chatMessage := newProtoChatMessage(
1047+
memberId,
1048+
&chatpb.Content{
1049+
Type: &chatpb.Content_IdentityRevealed{
1050+
IdentityRevealed: &chatpb.IdentityRevealedContent{
1051+
MemberId: req.MemberId,
1052+
Identity: req.Identity,
1053+
},
10731054
},
10741055
},
1075-
Ts: timestamppb.New(ts),
1076-
Cursor: &chatpb.Cursor{Value: messageId[:]},
1077-
}
1056+
)
10781057

10791058
err = s.data.ExecuteInTx(ctx, sql.LevelDefault, func(ctx context.Context) error {
10801059
err = s.data.UpgradeChatMemberIdentityV2(ctx, chatId, memberId, platform, req.Identity.Username)
@@ -1094,16 +1073,7 @@ func (s *server) RevealIdentity(ctx context.Context, req *chatpb.RevealIdentityR
10941073
})
10951074

10961075
if err == nil {
1097-
event := &chatpb.ChatStreamEvent{
1098-
Type: &chatpb.ChatStreamEvent_Message{
1099-
Message: chatMessage,
1100-
},
1101-
}
1102-
if err := s.asyncNotifyAll(chatId, memberId, event); err != nil {
1103-
log.WithError(err).Warn("failure notifying chat event")
1104-
}
1105-
1106-
// todo: send the push
1076+
s.onPersistChatMessage(log, chatId, chatMessage)
11071077
}
11081078

11091079
switch err {
@@ -1251,66 +1221,11 @@ func (s *server) SetSubscriptionState(ctx context.Context, req *chatpb.SetSubscr
12511221
}, nil
12521222
}
12531223

1254-
func (s *server) getProtoChatMessages(ctx context.Context, chatId chat.ChatId, owner *common.Account, queryOptions ...query.Option) ([]*chatpb.ChatMessage, error) {
1255-
messageRecords, err := s.data.GetAllChatMessagesV2(
1256-
ctx,
1257-
chatId,
1258-
queryOptions...,
1259-
)
1260-
if err == chat.ErrMessageNotFound {
1261-
return nil, err
1262-
}
1263-
1264-
var userLocale *language.Tag // Loaded lazily when required
1265-
var res []*chatpb.ChatMessage
1266-
for _, messageRecord := range messageRecords {
1267-
var protoChatMessage chatpb.ChatMessage
1268-
err = proto.Unmarshal(messageRecord.Data, &protoChatMessage)
1269-
if err != nil {
1270-
return nil, errors.Wrap(err, "error unmarshalling proto chat message")
1271-
}
1272-
1273-
ts, err := messageRecord.GetTimestamp()
1274-
if err != nil {
1275-
return nil, errors.Wrap(err, "error getting message timestamp")
1276-
}
1277-
1278-
for _, content := range protoChatMessage.Content {
1279-
switch typed := content.Type.(type) {
1280-
case *chatpb.Content_Localized:
1281-
if userLocale == nil {
1282-
loadedUserLocale, err := s.data.GetUserLocale(ctx, owner.PublicKey().ToBase58())
1283-
if err != nil {
1284-
return nil, errors.Wrap(err, "error getting user locale")
1285-
}
1286-
userLocale = &loadedUserLocale
1287-
}
1288-
1289-
typed.Localized.KeyOrText = localization.LocalizeWithFallback(
1290-
*userLocale,
1291-
localization.GetLocalizationKeyForUserAgent(ctx, typed.Localized.KeyOrText),
1292-
typed.Localized.KeyOrText,
1293-
)
1294-
}
1295-
}
1296-
1297-
protoChatMessage.MessageId = messageRecord.MessageId.ToProto()
1298-
if messageRecord.Sender != nil {
1299-
protoChatMessage.SenderId = messageRecord.Sender.ToProto()
1300-
}
1301-
protoChatMessage.Ts = timestamppb.New(ts)
1302-
protoChatMessage.Cursor = &chatpb.Cursor{Value: messageRecord.MessageId[:]}
1303-
1304-
res = append(res, &protoChatMessage)
1305-
}
1306-
1307-
return res, nil
1308-
}
1309-
13101224
func (s *server) toProtoChat(ctx context.Context, chatRecord *chat.ChatRecord, memberRecords []*chat.MemberRecord, myIdentitiesByPlatform map[chat.Platform]string) (*chatpb.ChatMetadata, error) {
13111225
protoChat := &chatpb.ChatMetadata{
13121226
ChatId: chatRecord.ChatId.ToProto(),
13131227
Kind: chatRecord.ChatType.ToProto(),
1228+
Cursor: &chatpb.Cursor{Value: query.ToCursor(uint64(chatRecord.Id))},
13141229
}
13151230

13161231
switch chatRecord.ChatType {
@@ -1390,6 +1305,75 @@ func (s *server) toProtoChat(ctx context.Context, chatRecord *chat.ChatRecord, m
13901305
return protoChat, nil
13911306
}
13921307

1308+
func (s *server) getProtoChatMessages(ctx context.Context, chatId chat.ChatId, owner *common.Account, queryOptions ...query.Option) ([]*chatpb.ChatMessage, error) {
1309+
messageRecords, err := s.data.GetAllChatMessagesV2(
1310+
ctx,
1311+
chatId,
1312+
queryOptions...,
1313+
)
1314+
if err == chat.ErrMessageNotFound {
1315+
return nil, err
1316+
}
1317+
1318+
var userLocale *language.Tag // Loaded lazily when required
1319+
var res []*chatpb.ChatMessage
1320+
for _, messageRecord := range messageRecords {
1321+
var protoChatMessage chatpb.ChatMessage
1322+
err = proto.Unmarshal(messageRecord.Data, &protoChatMessage)
1323+
if err != nil {
1324+
return nil, errors.Wrap(err, "error unmarshalling proto chat message")
1325+
}
1326+
1327+
ts, err := messageRecord.GetTimestamp()
1328+
if err != nil {
1329+
return nil, errors.Wrap(err, "error getting message timestamp")
1330+
}
1331+
1332+
for _, content := range protoChatMessage.Content {
1333+
switch typed := content.Type.(type) {
1334+
case *chatpb.Content_Localized:
1335+
if userLocale == nil {
1336+
loadedUserLocale, err := s.data.GetUserLocale(ctx, owner.PublicKey().ToBase58())
1337+
if err != nil {
1338+
return nil, errors.Wrap(err, "error getting user locale")
1339+
}
1340+
userLocale = &loadedUserLocale
1341+
}
1342+
1343+
typed.Localized.KeyOrText = localization.LocalizeWithFallback(
1344+
*userLocale,
1345+
localization.GetLocalizationKeyForUserAgent(ctx, typed.Localized.KeyOrText),
1346+
typed.Localized.KeyOrText,
1347+
)
1348+
}
1349+
}
1350+
1351+
protoChatMessage.MessageId = messageRecord.MessageId.ToProto()
1352+
if messageRecord.Sender != nil {
1353+
protoChatMessage.SenderId = messageRecord.Sender.ToProto()
1354+
}
1355+
protoChatMessage.Ts = timestamppb.New(ts)
1356+
protoChatMessage.Cursor = &chatpb.Cursor{Value: messageRecord.MessageId[:]}
1357+
1358+
res = append(res, &protoChatMessage)
1359+
}
1360+
1361+
return res, nil
1362+
}
1363+
1364+
func (s *server) onPersistChatMessage(log *logrus.Entry, chatId chat.ChatId, chatMessage *chatpb.ChatMessage) {
1365+
event := &chatpb.ChatStreamEvent{
1366+
Type: &chatpb.ChatStreamEvent_Message{
1367+
Message: chatMessage,
1368+
},
1369+
}
1370+
if err := s.asyncNotifyAll(chatId, event); err != nil {
1371+
log.WithError(err).Warn("failure notifying chat event")
1372+
}
1373+
1374+
// todo: send the push
1375+
}
1376+
13931377
func (s *server) getAllIdentities(ctx context.Context, owner *common.Account) (map[chat.Platform]string, error) {
13941378
identities := map[chat.Platform]string{
13951379
chat.PlatformCode: owner.PublicKey().ToBase58(),
@@ -1466,3 +1450,16 @@ func (s *server) getOwnedTwitterUsername(ctx context.Context, owner *common.Acco
14661450
return "", false, errors.Wrap(err, "error getting twitter user")
14671451
}
14681452
}
1453+
1454+
func newProtoChatMessage(sender chat.MemberId, content ...*chatpb.Content) *chatpb.ChatMessage {
1455+
messageId := chat.GenerateMessageId()
1456+
ts, _ := messageId.GetTimestamp()
1457+
1458+
return &chatpb.ChatMessage{
1459+
MessageId: messageId.ToProto(),
1460+
SenderId: sender.ToProto(),
1461+
Content: content,
1462+
Ts: timestamppb.New(ts),
1463+
Cursor: &chatpb.Cursor{Value: messageId[:]},
1464+
}
1465+
}

pkg/code/server/grpc/chat/v2/stream.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,14 @@ func boundedStreamChatEventsRecv(
9393
}
9494

9595
type chatEventNotification struct {
96-
chatId chat.ChatId
97-
memberId chat.MemberId
98-
event *chatpb.ChatStreamEvent
99-
ts time.Time
96+
chatId chat.ChatId
97+
event *chatpb.ChatStreamEvent
98+
ts time.Time
10099
}
101100

102-
func (s *server) asyncNotifyAll(chatId chat.ChatId, memberId chat.MemberId, event *chatpb.ChatStreamEvent) error {
101+
func (s *server) asyncNotifyAll(chatId chat.ChatId, event *chatpb.ChatStreamEvent) error {
103102
m := proto.Clone(event).(*chatpb.ChatStreamEvent)
104-
ok := s.chatEventChans.Send(chatId[:], &chatEventNotification{chatId, memberId, m, time.Now()})
103+
ok := s.chatEventChans.Send(chatId[:], &chatEventNotification{chatId, m, time.Now()})
105104
if !ok {
106105
return errors.New("chat event channel is full")
107106
}

0 commit comments

Comments
 (0)