github.com/status-im/status-go@v1.1.0/protocol/group_chat_system_messages.go (about) 1 package protocol 2 3 import ( 4 "strings" 5 "time" 6 7 "github.com/status-im/status-go/eth-node/crypto" 8 "github.com/status-im/status-go/eth-node/types" 9 "github.com/status-im/status-go/protocol/common" 10 "github.com/status-im/status-go/protocol/protobuf" 11 v1protocol "github.com/status-im/status-go/protocol/v1" 12 ) 13 14 var defaultSystemMessagesTranslations = new(systemMessageTranslationsMap) 15 16 func init() { 17 defaultSystemMessagesTranslationSet := map[protobuf.MembershipUpdateEvent_EventType]string{ 18 protobuf.MembershipUpdateEvent_CHAT_CREATED: "{{from}} created the group {{name}}", 19 protobuf.MembershipUpdateEvent_NAME_CHANGED: "{{from}} changed the group's name to {{name}}", 20 protobuf.MembershipUpdateEvent_MEMBERS_ADDED: "{{from}} has added {{members}}", 21 protobuf.MembershipUpdateEvent_ADMINS_ADDED: "{{from}} has made {{members}} admin", 22 protobuf.MembershipUpdateEvent_MEMBER_REMOVED: "{{member}} left the group", 23 protobuf.MembershipUpdateEvent_ADMIN_REMOVED: "{{member}} is not admin anymore", 24 protobuf.MembershipUpdateEvent_COLOR_CHANGED: "{{from}} changed the group's color", 25 protobuf.MembershipUpdateEvent_IMAGE_CHANGED: "{{from}} changed the group's image", 26 } 27 defaultSystemMessagesTranslations.Init(defaultSystemMessagesTranslationSet) 28 } 29 30 func tsprintf(format string, params map[string]string) string { 31 for key, val := range params { 32 format = strings.Replace(format, "{{"+key+"}}", val, -1) 33 } 34 return format 35 } 36 37 func eventToSystemMessage(e v1protocol.MembershipUpdateEvent, translations *systemMessageTranslationsMap) *common.Message { 38 var text string 39 switch e.Type { 40 case protobuf.MembershipUpdateEvent_CHAT_CREATED: 41 message, _ := translations.Load(protobuf.MembershipUpdateEvent_CHAT_CREATED) 42 text = tsprintf(message, map[string]string{"from": "@" + e.From, "name": e.Name}) 43 case protobuf.MembershipUpdateEvent_NAME_CHANGED: 44 message, _ := translations.Load(protobuf.MembershipUpdateEvent_NAME_CHANGED) 45 text = tsprintf(message, map[string]string{"from": "@" + e.From, "name": e.Name}) 46 case protobuf.MembershipUpdateEvent_COLOR_CHANGED: 47 message, _ := translations.Load(protobuf.MembershipUpdateEvent_COLOR_CHANGED) 48 text = tsprintf(message, map[string]string{"from": "@" + e.From}) 49 case protobuf.MembershipUpdateEvent_IMAGE_CHANGED: 50 message, _ := translations.Load(protobuf.MembershipUpdateEvent_IMAGE_CHANGED) 51 text = tsprintf(message, map[string]string{"from": "@" + e.From}) 52 case protobuf.MembershipUpdateEvent_MEMBERS_ADDED: 53 54 var memberMentions []string 55 for _, s := range e.Members { 56 memberMentions = append(memberMentions, "@"+s) 57 } 58 message, _ := translations.Load(protobuf.MembershipUpdateEvent_MEMBERS_ADDED) 59 text = tsprintf(message, map[string]string{"from": "@" + e.From, "members": strings.Join(memberMentions, ", ")}) 60 case protobuf.MembershipUpdateEvent_ADMINS_ADDED: 61 var memberMentions []string 62 for _, s := range e.Members { 63 memberMentions = append(memberMentions, "@"+s) 64 } 65 message, _ := translations.Load(protobuf.MembershipUpdateEvent_ADMINS_ADDED) 66 text = tsprintf(message, map[string]string{"from": "@" + e.From, "members": strings.Join(memberMentions, ", ")}) 67 case protobuf.MembershipUpdateEvent_MEMBER_REMOVED: 68 message, _ := translations.Load(protobuf.MembershipUpdateEvent_MEMBER_REMOVED) 69 text = tsprintf(message, map[string]string{"member": "@" + e.Members[0]}) 70 case protobuf.MembershipUpdateEvent_ADMIN_REMOVED: 71 message, _ := translations.Load(protobuf.MembershipUpdateEvent_ADMIN_REMOVED) 72 text = tsprintf(message, map[string]string{"member": "@" + e.Members[0]}) 73 74 } 75 timestamp := v1protocol.TimestampInMsFromTime(time.Now()) 76 message := &common.Message{ 77 ChatMessage: &protobuf.ChatMessage{ 78 ChatId: e.ChatID, 79 Text: text, 80 MessageType: protobuf.MessageType_SYSTEM_MESSAGE_PRIVATE_GROUP, 81 ContentType: protobuf.ChatMessage_SYSTEM_MESSAGE_CONTENT_PRIVATE_GROUP, 82 Clock: e.ClockValue, 83 Timestamp: timestamp, 84 }, 85 From: e.From, 86 WhisperTimestamp: timestamp, 87 LocalChatID: e.ChatID, 88 Seen: true, 89 ID: types.EncodeHex(crypto.Keccak256(e.Signature)), 90 } 91 // We don't pass an identity here as system messages don't need the mentioned flag 92 _ = message.PrepareContent("") 93 return message 94 } 95 96 func buildSystemMessages(events []v1protocol.MembershipUpdateEvent, translations *systemMessageTranslationsMap) []*common.Message { 97 var messages []*common.Message 98 99 for _, e := range events { 100 if e.Type == protobuf.MembershipUpdateEvent_MEMBER_JOINED { 101 // explicit join has been removed, ignore this event 102 continue 103 } 104 105 messages = append(messages, eventToSystemMessage(e, translations)) 106 } 107 108 return messages 109 }