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  }