github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/teams/chatmessaging.go (about)

     1  package teams
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/keybase/client/go/chat/globals"
     8  	"github.com/keybase/client/go/libkb"
     9  	"github.com/keybase/client/go/protocol/chat1"
    10  	"github.com/keybase/client/go/protocol/keybase1"
    11  )
    12  
    13  func SendTeamChatWelcomeMessage(ctx context.Context, g *libkb.GlobalContext, teamID keybase1.TeamID, team,
    14  	user string, membersType chat1.ConversationMembersType, role keybase1.TeamRole) (err error) {
    15  	if team == "" && !teamID.IsNil() {
    16  		teamname, err := ResolveIDToName(ctx, g, teamID)
    17  		if err != nil {
    18  			return fmt.Errorf("getting team name: %v", err)
    19  		}
    20  		team = teamname.String()
    21  	}
    22  	username := g.Env.GetUsername()
    23  	subBody := chat1.NewMessageSystemWithAddedtoteam(chat1.MessageSystemAddedToTeam{
    24  		Adder: username.String(),
    25  		Addee: user,
    26  		Role:  role,
    27  		Team:  team,
    28  	})
    29  	body := chat1.NewMessageBodyWithSystem(subBody)
    30  
    31  	// Ensure we have chat available, since TeamAddMember may also be
    32  	// coming from a standalone launch.
    33  	g.StartStandaloneChat()
    34  	var topicName *string
    35  	if membersType == chat1.ConversationMembersType_TEAM {
    36  		topicName = &globals.DefaultTeamTopic
    37  	}
    38  
    39  	_, err = g.ChatHelper.SendMsgByNameNonblock(ctx, team,
    40  		topicName, membersType, keybase1.TLFIdentifyBehavior_CHAT_CLI, body,
    41  		chat1.MessageType_SYSTEM, nil)
    42  	return err
    43  }
    44  
    45  func SendChatInviteWelcomeMessage(ctx context.Context, g *libkb.GlobalContext, team string,
    46  	category keybase1.TeamInviteCategory, inviter, invitee keybase1.UID, role keybase1.TeamRole) (res bool) {
    47  
    48  	if !g.Env.SendSystemChatMessages() {
    49  		g.Log.CDebugf(ctx, "Skipping SentChatInviteWelcomeMessage via environment flag")
    50  		return false
    51  	}
    52  
    53  	inviterName, err := g.GetUPAKLoader().LookupUsername(ctx, inviter)
    54  	if err != nil {
    55  		g.Log.CDebugf(ctx, "sendChatInviteWelcomeMessage: failed to lookup inviter username: %s", err)
    56  		return false
    57  	}
    58  	inviteeName, err := g.GetUPAKLoader().LookupUsername(ctx, invitee)
    59  	if err != nil {
    60  		g.Log.CDebugf(ctx, "sendChatInviteWelcomeMessage: failed to lookup invitee username: %s", err)
    61  		return false
    62  	}
    63  
    64  	username := g.Env.GetUsername()
    65  	subBody := chat1.NewMessageSystemWithInviteaddedtoteam(chat1.MessageSystemInviteAddedToTeam{
    66  		Team:       team,
    67  		Inviter:    inviterName.String(),
    68  		Invitee:    inviteeName.String(),
    69  		Adder:      username.String(),
    70  		Role:       role,
    71  		InviteType: category,
    72  	})
    73  	body := chat1.NewMessageBodyWithSystem(subBody)
    74  
    75  	if _, err = g.ChatHelper.SendMsgByNameNonblock(ctx, team,
    76  		&globals.DefaultTeamTopic,
    77  		chat1.ConversationMembersType_TEAM, keybase1.TLFIdentifyBehavior_CHAT_CLI, body,
    78  		chat1.MessageType_SYSTEM, nil); err != nil {
    79  		g.Log.CDebugf(ctx, "sendChatInviteWelcomeMessage: failed to send message: %s", err)
    80  		return false
    81  	}
    82  	return true
    83  }
    84  
    85  func SendChatSBSResolutionMessage(ctx context.Context, g *libkb.GlobalContext,
    86  	team, assertionUser, assertionService string,
    87  	prover keybase1.UID) (res bool) {
    88  
    89  	if !g.Env.SendSystemChatMessages() {
    90  		g.Log.CDebugf(ctx, "Skipping SentChatInviteWelcomeMessage via environment flag")
    91  		return false
    92  	}
    93  
    94  	proverName, err := g.GetUPAKLoader().LookupUsername(ctx, prover)
    95  	if err != nil {
    96  		g.Log.CDebugf(ctx, "SendChatSBSResolutionMessage: failed to lookup invitee username: %s", err)
    97  		return false
    98  	}
    99  
   100  	subBody := chat1.NewMessageSystemWithSbsresolve(chat1.
   101  		MessageSystemSbsResolve{
   102  		Prover:            proverName.String(),
   103  		AssertionUsername: assertionUser,
   104  		AssertionService:  assertionService,
   105  	})
   106  	body := chat1.NewMessageBodyWithSystem(subBody)
   107  
   108  	g.StartStandaloneChat()
   109  
   110  	if _, err = g.ChatHelper.SendMsgByNameNonblock(ctx, team, nil,
   111  		chat1.ConversationMembersType_IMPTEAMNATIVE,
   112  		keybase1.TLFIdentifyBehavior_CHAT_CLI, body,
   113  		chat1.MessageType_SYSTEM, nil); err != nil {
   114  		g.Log.CDebugf(ctx, "SendChatSBSResolutionMessage: failed to send message: %s", err)
   115  		return false
   116  	}
   117  	return true
   118  }
   119  
   120  func SendTeamChatCreateMessage(ctx context.Context, g *libkb.GlobalContext, team, creator string) bool {
   121  	var err error
   122  
   123  	if !g.Env.SendSystemChatMessages() {
   124  		g.Log.CDebugf(ctx, "Skipping SendTeamChatCreateMessage via environment flag")
   125  		return false
   126  	}
   127  
   128  	defer func() {
   129  		if err != nil {
   130  			g.Log.CWarningf(ctx, "failed to send team create message: %s", err.Error())
   131  		}
   132  	}()
   133  
   134  	subBody := chat1.NewMessageSystemWithCreateteam(chat1.MessageSystemCreateTeam{
   135  		Team:    team,
   136  		Creator: creator,
   137  	})
   138  	body := chat1.NewMessageBodyWithSystem(subBody)
   139  
   140  	// Ensure we have chat available
   141  	g.StartStandaloneChat()
   142  
   143  	if _, err = g.ChatHelper.SendMsgByNameNonblock(ctx, team,
   144  		&globals.DefaultTeamTopic,
   145  		chat1.ConversationMembersType_TEAM, keybase1.TLFIdentifyBehavior_CHAT_CLI, body,
   146  		chat1.MessageType_SYSTEM, nil); err != nil {
   147  		return false
   148  	}
   149  
   150  	return true
   151  }
   152  
   153  func SendTeamChatChangeAvatar(mctx libkb.MetaContext, team, username string) bool {
   154  	var err error
   155  
   156  	if !mctx.G().Env.SendSystemChatMessages() {
   157  		mctx.Debug("Skipping SendTeamChatChangeAvatar via environment flag")
   158  		return false
   159  	}
   160  
   161  	defer func() {
   162  		if err != nil {
   163  			mctx.Warning("failed to send team change avatar message: %s", err.Error())
   164  		}
   165  	}()
   166  
   167  	subBody := chat1.NewMessageSystemWithChangeavatar(chat1.MessageSystemChangeAvatar{
   168  		Team: team,
   169  		User: username,
   170  	})
   171  	body := chat1.NewMessageBodyWithSystem(subBody)
   172  
   173  	// Ensure we have chat available
   174  	mctx.G().StartStandaloneChat()
   175  
   176  	if _, err = mctx.G().ChatHelper.SendMsgByNameNonblock(mctx.Ctx(), team,
   177  		&globals.DefaultTeamTopic,
   178  		chat1.ConversationMembersType_TEAM, keybase1.TLFIdentifyBehavior_CHAT_CLI, body,
   179  		chat1.MessageType_SYSTEM, nil); err != nil {
   180  		return false
   181  	}
   182  
   183  	return true
   184  }