Skip to content

Commit

Permalink
If a clan autoJoin and allowApplication are true do not validate cool…
Browse files Browse the repository at this point in the history
…down after deny.
  • Loading branch information
cscatolini committed Jun 13, 2017
1 parent 1f514af commit ec9b48a
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 12 deletions.
26 changes: 14 additions & 12 deletions models/membership.go
Original file line number Diff line number Diff line change
Expand Up @@ -294,16 +294,17 @@ func CreateMembership(db DB, game *Game, gameID, level, playerPublicID, clanPubl
return nil, &InvalidLevelForGameError{gameID, level}
}

membership, _ := GetMembershipByClanAndPlayerPublicID(db, gameID, clanPublicID, playerPublicID)
playerID, previousMembership, err := validateMembership(db, game, membership, clanPublicID, playerPublicID, requestorPublicID)
if err != nil {
return nil, err
}

clan, clanErr := GetClanByPublicID(db, game.PublicID, clanPublicID)
if clanErr != nil {
return nil, clanErr
}

membership, _ := GetMembershipByClanAndPlayerPublicID(db, gameID, clan.PublicID, playerPublicID)
playerID, previousMembership, err := validateMembership(db, game, membership, clan, playerPublicID, requestorPublicID)
if err != nil {
return nil, err
}

if clan.OwnerID == playerID {
return nil, &AlreadyHasValidMembershipError{playerPublicID, clanPublicID}
}
Expand All @@ -315,24 +316,25 @@ func CreateMembership(db DB, game *Game, gameID, level, playerPublicID, clanPubl
return inviteMember(db, game, membership, level, clan, playerID, requestorPublicID, message, previousMembership)
}

func validateMembership(db DB, game *Game, membership *Membership, clanPublicID, playerPublicID, requestorPublicID string) (int, bool, error) {
func validateMembership(db DB, game *Game, membership *Membership, clan *Clan, playerPublicID, requestorPublicID string) (int, bool, error) {
playerID := -1
previousMembership := false
if membership != nil {
previousMembership = true
nowInMilliseconds := util.NowMilli()
applicationInOpenClan := requestorPublicID == playerPublicID && clan.AllowApplication && clan.AutoJoin
if membership.Approved {
return -1, false, &AlreadyHasValidMembershipError{playerPublicID, clanPublicID}
} else if membership.Denied && int(membership.DenierID.Int64) != membership.PlayerID {
return -1, false, &AlreadyHasValidMembershipError{playerPublicID, clan.PublicID}
} else if !applicationInOpenClan && membership.Denied && int(membership.DenierID.Int64) != membership.PlayerID {
timeToBeReady := game.CooldownAfterDeny - int(nowInMilliseconds-membership.DeniedAt)/1000
if timeToBeReady > 0 {
return -1, false, &MustWaitMembershipCooldownError{timeToBeReady, playerPublicID, clanPublicID}
return -1, false, &MustWaitMembershipCooldownError{timeToBeReady, playerPublicID, clan.PublicID}
}
} else if membership.DeletedAt > 0 && membership.DeletedBy != membership.PlayerID && playerPublicID == requestorPublicID {
// Allow immediate memebership creation if player is being invited
timeToBeReady := game.CooldownAfterDelete - int(nowInMilliseconds-membership.DeletedAt)/1000
if timeToBeReady > 0 {
return -1, false, &MustWaitMembershipCooldownError{timeToBeReady, playerPublicID, clanPublicID}
return -1, false, &MustWaitMembershipCooldownError{timeToBeReady, playerPublicID, clan.PublicID}
}
} else {
// TODO: When allowing 'memberLeft' players to apply we do not avoid flooding in this case =/
Expand All @@ -346,7 +348,7 @@ func validateMembership(db DB, game *Game, membership *Membership, clanPublicID,
if cd != 0 {
timeToBeReady := cd - int(nowInMilliseconds-membership.UpdatedAt)/1000
if timeToBeReady > 0 {
return -1, false, &MustWaitMembershipCooldownError{timeToBeReady, playerPublicID, clanPublicID}
return -1, false, &MustWaitMembershipCooldownError{timeToBeReady, playerPublicID, clan.PublicID}
}
}
}
Expand Down
56 changes: 56 additions & 0 deletions models/membership_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1120,6 +1120,62 @@ var _ = Describe("Membership Model", func() {
Expect(err).NotTo(HaveOccurred())
Expect(dbClan.MembershipCount).To(Equal(1))
})

It("If denied previous membership request and clan autoJoin is changed to true, before waiting cooldown seconds", func() {
// create a pending membership application
game, clan, owner, players, _, err := GetClanWithMemberships(testDb, 0, 0, 0, 1, "", "", false, false)
Expect(err).NotTo(HaveOccurred())

// deny application
_, err = ApproveOrDenyMembershipApplication(
testDb,
game,
players[0].GameID,
players[0].PublicID,
clan.PublicID,
owner.PublicID,
"deny",
)
Expect(err).NotTo(HaveOccurred())

game.CooldownBeforeApply = 0
game.CooldownAfterDeny = 100000
_, err = testDb.Update(game)
Expect(err).NotTo(HaveOccurred())

// change clan autoJoin to true
clan.AutoJoin = true
_, err = testDb.Update(clan)
Expect(err).NotTo(HaveOccurred())

// apply for membership again
membership, err := CreateMembership(
testDb,
game,
players[0].GameID,
"Member",
players[0].PublicID,
clan.PublicID,
players[0].PublicID,
"Please accept me",
)

Expect(err).NotTo(HaveOccurred())
Expect(membership.Approved).To(BeTrue())

dbMembership, err := GetMembershipByID(testDb, membership.ID)
Expect(err).NotTo(HaveOccurred())
Expect(dbMembership.Approved).To(BeTrue())
Expect(dbMembership.Denied).To(Equal(false))

dbPlayer, err := GetPlayerByID(testDb, dbMembership.PlayerID)
Expect(err).NotTo(HaveOccurred())
Expect(dbPlayer.MembershipCount).To(Equal(1))

dbClan, err := GetClanByID(testDb, clan.ID)
Expect(err).NotTo(HaveOccurred())
Expect(dbClan.MembershipCount).To(Equal(2))
})
})

Describe("Should not create a new Membership with CreateMembership if", func() {
Expand Down

0 comments on commit ec9b48a

Please sign in to comment.