diff --git a/src/github.com/matrix-org/go-neb/services/meetingbot/meetingbot.go b/src/github.com/matrix-org/go-neb/services/meetingbot/meetingbot.go index ed4568e..5e13d24 100644 --- a/src/github.com/matrix-org/go-neb/services/meetingbot/meetingbot.go +++ b/src/github.com/matrix-org/go-neb/services/meetingbot/meetingbot.go @@ -3,7 +3,8 @@ package meetingbot import ( "fmt" - "regexp" + "regexp" + "sync" "github.com/matrix-org/go-neb/types" "github.com/matrix-org/gomatrix" @@ -23,6 +24,8 @@ var currentUser string var meetingChair = "" var regexpAll = regexp.MustCompile(".*") +var mutex sync.Mutex + // Commands supported: // !rollcall // Responds with a notice of "meeting started" @@ -35,6 +38,9 @@ func (e *Service) Commands(cli *gomatrix.Client) []types.Command { types.Command{ Path: []string{"rollcall"}, Command: func(roomID, userID string, args []string) (interface{}, error) { + mutex.Lock() + defer mutex.Unlock() + if meetingChair != "" { return &gomatrix.TextMessage{"m.text", string("Meeting already in progress")}, nil } @@ -45,11 +51,14 @@ func (e *Service) Commands(cli *gomatrix.Client) []types.Command { types.Command{ Path: []string{"present"}, Command: func(roomID, userID string, args []string) (interface{}, error) { + mutex.Lock() + defer mutex.Unlock() + var present = false for i := 0; i < len(attendeesList); i++ { if attendeesList[i] == userID { present = true - break; + break } } if !present { @@ -61,20 +70,23 @@ func (e *Service) Commands(cli *gomatrix.Client) []types.Command { types.Command{ Path: []string{"next"}, Command: func(roomID, userID string, args []string) (interface{}, error) { + mutex.Lock() + defer mutex.Unlock() + if userID != meetingChair { return &gomatrix.TextMessage{"m.text", string("To avoid confusion, only the chair may progress")}, nil } if len(attendeesList) > 0 { currentUser = attendeesList[0] attendeesList = attendeesList[1:] - doneAttendeesList = append(doneAttendeesList, currentUser) + doneAttendeesList = append(doneAttendeesList, currentUser) var nextUser = "Silence!" if len(attendeesList) > 0 { nextUser = attendeesList[0] } return &gomatrix.TextMessage{"m.text", fmt.Sprintf("%s's turn, Followed by %s", currentUser, nextUser)}, nil } else { - meetingChair = "" + meetingChair = "" return &gomatrix.TextMessage{"m.text", string("Meeting is over, thanks for attending!")}, nil } }, @@ -82,10 +94,12 @@ func (e *Service) Commands(cli *gomatrix.Client) []types.Command { } } - func (s *Service) Expansions(cli *gomatrix.Client) []types.Expansion { return []types.Expansion{ types.Expansion{ + mutex.Lock() + defer mutex.Unlock() + Regexp: regexpAll, Expand: func(roomID, userID string, issueKeyGroups []string) interface{} { if meetingChair != "" { @@ -93,14 +107,14 @@ func (s *Service) Expansions(cli *gomatrix.Client) []types.Expansion { for i := 0; i < len(doneAttendeesList); i++ { if doneAttendeesList[i] == userID { done = true - break; + break } } var present = false for i := 0; i < len(attendeesList); i++ { if attendeesList[i] == userID { present = true - break; + break } } if !done && !present && userID != s.ServiceUserID() && userID != meetingChair { @@ -115,6 +129,9 @@ func (s *Service) Expansions(cli *gomatrix.Client) []types.Expansion { func init() { types.RegisterService(func(serviceID, serviceUserID, webhookEndpointURL string) types.Service { + mutex.Lock() + defer mutex.Unlock() + return &Service{ DefaultService: types.NewDefaultService(serviceID, serviceUserID, ServiceType), }