GT - COMPETITION - Português

Neste tutorial vamos aprender como configurar a técnica de competições na plataforma Funifier. Ao final deste tutorial você terá aprendido como criar uma competição, registrar um jogador em uma competição, convidar jogadores para uma competição, apresentar resultados parciais de uma competição e como apurar os ganhadores finais.

A TÉCNICA DE COMPETIÇÃO

Competição é uma disputa entre dois ou mais jogadores que acontece dentro de um determinado período para avaliar quais jogadores alcançam os melhores resultados. Uma competição pode estipular o número máximo de participantes, bem como o número máximo de vencedores. Além disso, o critério de classificação dos competidores deve ser definido assim que a competição é criada. Os jogadores interessados devem se registrar na competição para participar e serem considerados na determinação dos vencedores. Como recompensa, os vencedores de uma competição ganham o título de vencedor da competição com sua respectiva posição na classificação, e também podem ganhar outros prêmios como pontos. Uma competição envolve várias técnicas de jogo como leaderboard, status points, quest lists, antecipade parade, progress bar, crowning, instant feedback, monitor attachment, envy cloud, group quest, appointment dynamics, countdown timer, moats, suspenseful limit, evanescent opportunity.

CONFIGURANDO A TÉCNICA DE COMPETIÇÃO

Para criar uma nova competição utilizando a Funifier Rest API, utilize o endpoint /v3/competition. Para criar a competição você deverá definir algumas informações muito importantes como o título da competição, o período da competição, o número máximo de competidores e o número máximo de ganhadores, bem como o critério de apuração dos ganhadores e eventuais recompensas para os ganhadores. Veja o exemplo abaixo:

POST http://service2.funifier.com/v3/competition

{
 "title" : "Competition",
 "description" : "Competition Description",
 "image" : "http://image.com/holiday.png",
 "period" : {"expression": "2018-07-30T00:00:00-03:00;+1M+"},
 "maxWinners" : 3,
 "maxPlayers" : -1,
 "operation" : {"type" : 1, "item" : "sell"},
 "requires" : [ ],
 "rewards" : [
   {"total" : 1, "type" : 0, "item" : "point", "extra" : { }},
   {"total" : 10, "type" : 0, "item" : "point", "extra" : { "position" : 1 }}
 ],
 "notifications" : [
   {"event" : 0, "type" : 0, "scope" : 0, "content" : "Parabéns {{player.name}} você ganhou a competição"}
 ],
 "active" : true,
 "autoExecute" : true,
 "extra" : { "holiday" : "Carnival" },
 "_id" : "my_competition"
}

CAMPO

EXEMPLO

DESCRIÇÃO

title

Competição

Os campos title, description e image é a forma amigável como a competição será apresentada aos jogadores.

period.expression

2018-01-30T00:00:00-03:00;+1M+

Representa a data inicial e final de apuração dos ganhadores da competição. As duas datas são separadas por (;) e aceitam o formato internacional de datas com timezone (2018-01-30T00:00:00-03:00) e expressão de datas da Funifier (+1M+). Neste exemplo a competição está marcada para iniciar a zero hora do dia 2018-01-30 e terminar na última hora do último dia do mês seguinte (+1M+).

maxWinners

3

Número máximo da ganhadores permitidos para a competição. Em geral é um número positivo, por exemplo 3 ganhadores. Mas você pode definir que todos os participantes da competição são ganhadores, então neste caso você pode informar o número -1 para isso.

maxPlayers

-1

Número máximo de competidores aceitos na competição. Em geral é um número positivo, por exemplo 100 participantes. Mas você pode definir que a competição não tem limite de participantes, então neste caso você pode informar o número -1.

operation

Jogadores com mais ações de vendas

{"type" : 1, "item" : "sell"}

Determina como serão apurados os ganhadores. Por exemplo, os ganhadores são os jogadores com maior número de vendas registradas na gamificação. Para isso você pode definir o tipo de operação (type:1) para contar o total de actions. O item que será contabilizado (item:sell).

requires

[

{"total": 1, "type": 3, "item": "master", "operation" : 0},

{"total": 1, "type": 0, "item": "coin", "operation" : 1},

]

Lista os requisitos para participar da competição. Estes requisitos são verificados no momento em que o jogador se registra para participar da competição (join). Os requisitos podem ser apenas para verificação e também podem ser para debitar do saldo do jogador. Exemplo, verificar se o jogador está no nível master e debitar uma moeda para entrar na competição.

rewards

[

{"total" : 1, "type" : 0, "item" : "point", "extra" : { }},

{"total" : 10, "type" : 0, "item" : "point", "extra" : { "position" : 1 }}

]

Lista de recompensas da competição, cada recompensa deve informar o total, tipo e item. Exemplo: 1 ponto xp para todos os ganhadores, seria representado como {"total": 1, "type": 0, "item" : "xp"}. Você também pode definir recompensas para o ganhador que ficar em uma posição específica, Exemplo: 10 pontos gold para o ganhador na primeira posição, seria representado como {"total": 10, "type": 0, "item" : "gold", "extra" : { "position" : 1 }}

notifications

[
{"event" : 0, "type" : 0, "scope" : 0, "content" : "Parabéns {{player.name}} você ganhou a competição"}
]

Lista de mensagens que serão disparadas quando um evento relacionado com a competição acontecer. Por exemplo quando um jogador ganhar uma competição apresentar uma mensagem privada dizendo “Parabéns, você ganhou a competição”.

active

true

Indica se a competição está ativa ou não. Jogadores não podem entrar em uma competição inativa.

autoExecute

true

Determina se o funifier deverá executar automaticamente a apuração dos ganhadores de uma competição ou não. Caso verdadeiro, o funifier irá executar esta operação na data e hora final da competição, calculada a partir do critério definido na expressão period.

Após cadastrar a competição através da api rest o Funifier irá calcular algumas informações adicionais da competição são elas.

CAMPO

DESCRIÇÃO

start

Data de início da competição. Esta é a data inicial a partir da qual os dados de apuração de resultados será considerada.

end

Data de fim da competição. Esta é a data final a ser considerada na apuração de resultados dos ganhadores.

created

Data de criação da competição no sistema.

updated

Data em que a competição foi atualizada no sistema pela última vez.

OPERATION: CRITÉRIO DE APURAÇÃO DOS GANHADORES

Existem várias operações possíveis para apurar os ganhadores de uma competição. O campo operation possui internamente os seguintes campos:

CAMPO

DESCRIÇÃO

EXEMPLOS

type

Define o tipo de operação que será realizada, as operações podem ser 1 (contar o total de action logs), 2 (somar um atributo específicos dos action logs), 3 (somar o total de achievements) ou 4 (fazer uma média com um atributo específico dos action logs)

type:1

achievement_type

Este campo é usado exclusivamente quando o type é igual a 3. Ele define o tipo de conquista que deverá ser considerada. Os tipos de conquistas podem ser 0 (pontos), 1 (challenge), 2 (ítems de um catálogo), 3 (level).

achievement_type:0

item

Determina o item que deverá ser contabilizado. Se o type for 1, 2 ou 4 então deverá ser informado o id da action que deverá ser considerada na apuração. Se o type for 3 então deverá ser informado o id da conquista que está sendo apurada conforme o achievement_type.

item:”sell”

attribute

Este campo é usado apenas quando o type é igual a 2 ou 4. Ele indica o atributo dentro do campo attributes do action log que deve ser contabilizado.

attribute:”price”

filters

Filtros podem ser aplicados nas operações relacionadas com os logs de ações 1, 2 e 4. No filtro você pode informar definir que apenas ações onde os atributos tenham um determinado valor. Por exemplo, suponha que você deseja filtrar apenas as action logs onde o campo attributes.product seja igual a "book", então você pode definir um filtro com a estrutura ao lado.

"filters": [{"param":"product", "operator":1, "value":"book"}]

Veja alguns exemplos de estruturas do objeto “Operation” abaixo:

DESCRIÇÃO

EXEMPLO

Soma todos os valores do campo “attributes.price” de todas as action logs “sell”.

"operation": {

        "type": 2,

        "item": "sell",

        "attribute": "price",

        "sort": -1

}

Descobre o total de action logs “sell” com o campo “attributes.product” igual a “book”.

"operation": {
   "type": 1,
   "sort": -1,
   "item": "sell",
   "filters": [
           {"param":"product", "operator":1, "value":"book"}
   ]
 }

Descobre a média do valor das vendas de livros, ou seja faz a média do campo “attributes.price” das action logs “sell” onde o campo “attributes.product” seja igual a “book”.

"operation": {

        "type": 4,

        "item": "sell",

        "attribute": "price",

        "sort": -1,

        "filters": [

                {"param":"product", "operator":1, "value":"book"}

        ]

}

Descobre o total de pontos do tipo “coin” que cada jogador registrado na competição ganhou.

"operation": {

        "type": 3,

        "item": "coin",

        "achievement_type": 0,

        "sort": -1

}

REGISTRANDO UM JOGADOR EM UMA COMPETIÇÃO

Para um jogador entrar em uma competição existem alguns pré-requisitos, a competição precisa estar ativa, o jogador precisa atender aos requisitos determinados na competição e ele também registrar sua intenção de participar através do endpoint /v3/competition/join. Veja abaixo como cadastrar o jogador em uma competição.

POST http://service2.funifier.com/v3/competition/join

{
 "player" : "tom",
 "competition" : "my_competition"
}

Caso o jogador não atenda aos requisitos da competição o sistema irá retornar uma mensagem informando a restrição identificada.

{
   "restrictions": [
       "insufficient_requirements"
   ],
   "status": "UNAUTHORIZED"
}

Caso o jogador atenda todos os critérios o sistema irá apresentar uma mensagem de sucesso.

{

    "join": {

        "competition": "my_duel",

        "player": "tom",

        "created": 1535418242948,

        "_id": "5b849f82421c4812231730ec"

    },

    "status": "OK"

}

REMOVENDO UM JOGADOR DE UMA COMPETIÇÃO

Um jogador pode sair de uma competição a qualquer momento. Mas ao sair da competição não há reversão dos débitos realizados no momento da entrada. Veja o exemplo abaixo de como sair de uma competição utilizando a api rest.

DELETE http://service2.funifier.com/v3/competition/join

{
 "player" : "tom",
 "competition" : "my_competition"
}

LOCALIZANDO OS JOGADORES REGISTRADOS EM UMA COMPETIÇÃO

Para localizar todos os jogadores que se registraram em uma competição você pode utilizar o endpoint /v3/competition/join e fazer os filtros que forem necessários. Segue abaixo a consulta para trazer todos os registros de uma competição:

GET http://service2.funifier.com/v3/competition/join?competition=my_competition

Como resultado você deverá obter uma lista de joins realizados, com jogador e competição em que entrou, bem como a data em que o jogador entrou na competição:

[
   {
       "competition": "my_competition",
       "player": "tom",
       "created": 1535396257310,
       "_id": "5b8449a1421c480fa33fbff9"
   },
   {
       "competition": "my_competition",
       "player": "jerry",
       "created": 1535396983022,
       "_id": "5b844c77421c480fa33fbffa"
   },
   {
       "competition": "my_competition",
       "player": "ben",
       "created": 1535397026124,
       "_id": "5b844ca2421c480fa33fbffb"
   },
   {
       "competition": "my_competition",
       "player": "ric",
       "created": 1535397137635,
       "_id": "5b844d11421c480fa33fbffc"
   }
]

CONVIDANDO UM JOGADOR PARA UMA COMPETIÇÃO

No marketplace, acesse opção Bônus e clique no botão New Bônus, na tela de administração.

CONVIDANDO UM JOGADOR ALEATÓRIO PARA UM DUELO

No marketplace, acesse opção Bônus e clique no botão New Bônus, na tela de administração.

APRESENTANDO APURAÇÃO PARCIAL DE UMA COMPETIÇÃO

Para visualizar os líderes atuais de uma competição você pode utilizar o endpoint /v3/competition/leader. Os líderes são apurados em tempo real, e são considerados apenas os resultados dentro da data inicial e final da competição para aqueles jogadores que conseguiram fazer join na competição. Porém, se na competição não existir nenhum jogador que tenha efetuado join, então o Funifier entende que deve considerar todos os jogadores. Veja abaixo:

GET http://service2.funifier.com/v3/competition/leader?id=my_competition

Como resultado você deverá obter uma lista de líderes, com id, posição e total.

[
   {"player": "tom", "total": 3, "position": 1},
   {"player": "jerry", "total": 2, "position": 2},
   {"player": "ben", "total": 1, "position": 3},
   {"player": "ric", "total": 1, "position": 4}
]

APRESENTANDO APURAÇÃO PARCIAL DE UMA COMPETIÇÃO COM AGGREGATION

Caso você precise recuperar informações adicionais dos líderes de uma competição você pode utilizar o recurso de agregação. Por exemplo, você precisa recuperar o nome e foto dos líderes, estas informações não são apresentadas por padrão na consulta de líderes de uma competição, mas podem ser incluídas usando o endpoint competition/leader/aggregate. Veja abaixo um exemplo de como incluir o nome do jogador na lista de líderes da competição.

POST http://service2.funifier.com/v3/competition/leader/aggregate?id=sell_book_duel

Content-Type: application/json
Authorization: Basic NWI5MThhZmJkOTZjN...
[
        {"$lookup":{"from": "player", "localField":"player", "foreignField":"_id", "as": "p"}},
        {"$unwind":"$p" },
        {"$project":{ "name":"$p.name", "player":1, "total":1, "position":1 }}
]

EXECUTANDO A APURAÇÃO FINAL DE UMA COMPETIÇÃO

Caso a competição tenha sido configurada para não executar automaticamente, você poderá apurar o resultado final da competição usando o endpoint /v3/competition/{id}/execute. Isso irá apurar quem são os ganhadores, distribuir as eventuais recompensas para cada um dos ganhadores, disparar as notificações, registrar a conquista da competição e executar as triggers vinculadas ao fim da competição. Esta operação pode ser executada apenas uma vez por competição. Após isso o funifier irá registrar a data da apuração do resultado no registro da competição. Veja abaixo o resultado da execução da competição.

GET http://service2.funifier.com/v3/competition/{id}/execute

Como resultado você deverá obter a lista de ganhadores (achievements) e na sequência a configuração da competição que foi executada.

{
   "winners": [
       {
           "player": "tom",
           "total": 1,
           "type": 9,
           "item": "my_competition",
           "time": 1535413666675,
           "extra": {
               "total": 3,
               "position": 1
           },
           "_id": "5b848da2421c480d18cbf908"
       },
       {
           "player": "jerry",
           "total": 1,
           "type": 9,
           "item": "my_competition",
           "time": 1535413666892,
           "extra": {
               "total": 2,
               "position": 2
           },
           "_id": "5b848da2421c480d18cbf90b"
       },
       {
           "player": "ben",
           "total": 1,
           "type": 9,
           "item": "my_competition",
           "time": 1535413666939,
           "extra": {
               "total": 1,
               "position": 3
           },
           "_id": "5b848da2421c480d18cbf90e"
       }
   ],
   "competition": {
       "title": "Competition",
       "description": "Competition Description",
       "image": "http://image.com/holiday.png",
       "period" : {"expression": "2018-07-30T00:00:00-03:00;+1M+"},
       "maxWinners": 3,
       "maxPlayers": -1,
       "operation": {
           "type": 1,
           "achievement_type": 0,
           "item": "sell",
           "sort": 0,
           "sub": false
       },
       "requires": [],
       "rewards": [
           {
               "total": 1,
               "type": 0,
               "item": "point",
               "operation": 0,
               "extra": {}
           },
           {
               "total": 10,
               "type": 0,
               "item": "point",
               "operation": 0,
               "extra": {
                   "position": 1
               }
           }
       ],
       "notifications": [
           {
               "event": 0,
               "type": 0,
               "scope": 0,
               "content": "Parabéns {{player.name}} você ganhou a competição"
           }
       ],
       "active": true,
       "autoExecute": true,
       "extra": {
           "holiday": "Carnival"
       },
       "created": 1535392754528,
       "updated": 1535395241104,
       "executed": 1535413667011,
       "_id": "my_competition"
   }
}

EXECUTANDO TRIGGERS EM COMPETIÇÕES

Triggers podem ser executadas em vários momentos durante uma competição, ao criar uma competição, quando um jogador vence uma competição, quando um jogador entra em uma competição e quando o jogador aceita o convite para participar de uma competição. Segue abaixo a tabela destes vários eventos relacionados às competições que aceitam triggers.

ENTIDADE

EVENTOS

DESCRIÇÃO

competition

before_create, after_create

Quando uma nova competição está sendo criada. A entidade passada no script da trigger é uma Competition.

competition

before_win, after_win

Quando um jogador ganha uma competição. A entidade passada no script da trigger é um Achievement.

competition_join

before_create, after_create

Quando um jogador faz o join em uma competição. A entidade passada no script da trigger é um CompetitionJoin.

On Invite (mensagem)

On Accept Invite or Reject an Invite

EXCLUINDO UMA COMPETIÇÃO

Você pode excluir uma competição utilizando o endpoint /v3/competition. Ao excluir uma competição, todos os dados vinculados a competição serão removidos, como joins, achievements e notificações. Veja o exemplo de como excluir uma competição.

DELETE http://service2.funifier.com/v3/competition/my_competition

CRIANDO UM DUELO COM OPONENTES ALEATÓRIOS

Com a técnica de competições você pode criar um duelo, competição entre duas pessoas. Suponha que você queira fazer um duelo entre dois oponentes aleatórios e o vencedor será aquele que tiver o maior resultado em vendas. Para fazer um duelo vamos começar criando uma competição com no máximo dois competidores e apenas 1 ganhador, onde a operação de apuração consiste na soma dos atributos “price” das ações “sell” que cada participante realizou. Veja abaixo o exemplo de configuração do nosso duelo de vendas para jogadores aleatórios.

POST http://service2.funifier.com/v3/competition

{
 "title" : "Duel",
 "description" : "Duel among the best sellers",
 "image" : "http://image.com/duel.png",
 "period" : {"expression": "2018-07-30T00:00:00-03:00;+1M+"},
 "maxWinners" : 1,
 "maxPlayers" : 2,
 "operation": {
   "type": 2,
   "achievement_type": 0,
   "item": "sell",
   "attribute": "price",
   "sort": -1
 },
 "requires" : [ ],
 "rewards" : [
   {"total" : 10, "type" : 0, "item" : "point", "operation" : 0, "extra" : { "position" : 1 }}
 ],
 "notifications" : [
   {"event" : 0, "type" : 0, "scope" : 0, "content" : "Congratulations {{player.name}} you won the sales duel"}
 ],
 "active" : true,
 "autoExecute" : true,
 "extra" : {},
 "_id" : "my_duel"
}

Após criar sua competição, vamos deixar o sistema escolher dois oponentes aleatoriamente. Para isso vamos fazer uma requisição no endpoint “join” informando uma palavra reservada “FUNIFIER_RANDOM_PLAYER” no lugar do id do jogador. Veja abaixo como fazer o join de um jogador aleatório.

POST http://service2.funifier.com/v3/competition/join

{
 "player" : "FUNIFIER_RANDOM_PLAYER",
 "competition" : "my_duel"
}

Como resultado o sistema irá escolher um jogador válido aleatoriamente e retornar no campo player.

{

    "join": {

        "competition": "my_duel",

        "player": "tom",

        "created": 1535418242948,

        "_id": "5b849f82421c4812231730ec"

    },

    "status": "OK"

}

APRESENTANDO APURAÇÃO FINAL DE UMA COMPETIÇÃO

Para visualizar os ganhadores de uma competição você pode utilizar o endpoint /v3/database/achievement/aggregate. Quando uma competição é concluída, são registrados achievements para os ganhadores. E podemos criar uma consulta agregando o achievement dos ganhadores com os dados do objeto player, para criar uma lista com informações amigáveis dos competidores que ganharam uma competição. Veja abaixo um exemplo que apresenta o nome, foto e posição do vencedor em uma competição. Caso você não esteja muito familiarizado(a) com a operação de agregação abaixo, consulte a documentação (FUNIFIER REST API - Aggregation).

POST http://service2.funifier.com/v3/database/achievement/aggregate

[
{ "$match":{ "item":"my_competition" }},
{ "$lookup": {"from":"player", "localField":"player", "foreignField":"_id", "as":"p" }},
{ "$unwind" : "$p" },
{ "$project": { "competition":"$item", "player":1, "player_name":"$p.name", "position":"$extra.position", "total":"$extra.total" }},
{ "$sort":{ "position": 1 }}
]

EXEMPLO: DUELO DOS MAIORES VENDEDORES DE LIVROS

Vamos supor que seus jogadores estão registrando ações de vendas de livros na sua gamificação com a estrutura de action/log abaixo:

POST http://service2.funifier.com/v3/action/log

{

        "actionId" : "sell",

        "userId" : "ricardo",

        "attributes":{

                "product":"book"

        }

}

Você quer criar um duelo para ver qual de dois jogadores irá registrar mais vendas de livros no mês. Para isso você pode criar uma competição informando na operação o type:1, para contabilizar action/logs. No item informe o id da ação “sell” que será contabilizada, e por fim informe no campo filters o parâmetro “product” com valor igual á “book”. No final sua competição terá estrutura abaixo:

POST https://service2.funifier.com/v3/competition

{
 "title" : "Book Sales Duel",
 "description" : "Evaluate who sell more books",
 "image" : "http://image.com/duel.png",
 "period" : {"expression": "2018-07-30T00:00:00-03:00;+1M+"},
 "maxWinners" : 1,
 "maxPlayers" : 2,
 "operation": {
   "type": 1,
   "sort": -1,
   "item": "sell",
   "filters": [
           {"param":"product", "operator":1, "value":"book"}
   ]
 },
 "requires" : [ ],
 "rewards" : [
   {"total" : 10, "type" : 0, "item" : "coin", "operation" : 0, "extra" : { "position" : 1 }}
 ],
 "notifications" : [
   {"event" : 0, "type" : 0, "scope" : 0, "content" : "Congratulations {{player.name}} you won the book sales duel"}
 ],
 "active" : true,
 "autoExecute" : true,
 "extra" : {},
 "_id" : "sell_book_duel"
}

EXEMPLO: COMPETIÇÕES COM PREPARED KPIS

Vamos supor que você precisa criar uma competição com uma regra complexa de apuração dos líderes, para isso você pode criar indicadores preparados, que poderão ser utilizados na regra de apuração dos ganhadores. Vamos supor que você possua uma ação com a seguinte estrutura:

{

    "action": "do",

    "attributes": [

        {"name": "x", "type": "Number"},

        {"name": "y", "type": "Number"}

    ],

    "_id": "do"

}

Você precisa criar uma competição em que os líderes são avaliados com base no somatório do campo “x” dividido pelo somatório do campo “y” da ação “do”. Você pode então criar um indicador preparado com a seguinte estrutura e registrá-lo no endpoint.

http://service2.funifier.com/v3/database/challenge_rule_prepared

Ao criar este indicador preparado você poderá utilizá-lo na configuração da sua competição. Na área de operações escolha o tipo indicador preparado, e em seguida selecione um indicador que você acabou de construir.

EXEMPLO: CRITÉRIO DE DESEMPATE CUSTOMIZADO COM PREPARED KPIS

por padrão na plataforma de gamificação FUNIFIER possui uma regra de desempate em técnicas de jogos que utilizam algum tipo de classificação dos jogadores como competições e rankings. O critério de desempate padrão é feito através da data e hora em que os jogadores alcançaram o resultado. por exemplo, caso dois jogadores possuem o mesmo resultado em uma competição ou ranking então será classificado em primeiro lugar aquele que tiver alcançado o resultado primeiro. Para testarmos este critério de desempate vamos, após configurar o desafio acima, alimentar a base de dados com os logs de ação abaixo.

POST http://service2.funifier.com/v3/action/log/bulk

[

        {

          "_id": "01",

          "actionId" : "do",

          "userId" : "testador1",

          "attributes" : {

                  "x" : 4, "y" : 2

          },

          "time": 1562187980875

        },

        {

          "_id": "02",

          "actionId" : "do",

          "userId" : "testador2",

          "attributes" : {

                  "x" : 8, "y" : 4

          },

          "time": 1562187980876

        }

]

Perceba que o resultado da operação x / y para os dois jogadores irá dar o mesmo resultado, porém o testador 1 registrou a ação antes do testador 2 confira esta informação no campo “time”. Agora vamos clicar na opção líderes da competição para ver o resultado, você precisará registrar estes dois jogadores na competição antes de realizar o teste.

Agora vamos supor que você queira definir o seu próprio critério de desempate, e neste caso você deseja colocar em primeiro lugar aquele jogador que possuir o maior somatório do campo X. Neste caso você pode começar alterando o indicador preparado para disponibilizar o campo X no resultado final.

Em seguida você pode voltar para a tela de edição da competição e habilitar o campo de desempate informando o campo X e escolhendo a ordenação descendente do maior para o menor. Conforme exemplo abaixo:

Agora ao visualizar novamente a relação de líderes da competição você terá um resultado diferente, onde o testador 2 está na primeira posição pois agora o critério de desempate está considerando a quantidade total existente na coluna X ordenando do maior para o menor.

EXEMPLO: DISTRIBUINDO RECOMPENSAS PARA MEMBROS DA EQUIPE VENCEDORA

Vamos supor que você tenha criado uma competição entre equipes, e agora deseja recompensar os membros da equipe vencedora com a relação de recompensas que você estipulou na competição. Neste caso você pode utilizar uma trigger, que deverá ser executada logo após o evento de conquista da competição, e a trigger deverá identificar as recompensas que será distribuída para equipe, identificar quais são os membros daquela equipe, e na sequência registrar as recompensas da competição para cada um dos membros da equipe vencedora.

Neste caso vamos criar uma competição e incluir ir em um campo extra conforme imagem abaixo:

Na área de recompensas inclua tudo aquilo que você deseja distribuir para os membros da equipe vencedora:

Em seguida vamos criar uma trigger, que irá identificar se a competição possui o campo extra que foi criado, em seguida irá descobrir quais são os membros da equipe vencedora, e na sequência irá percorrer as recompensas da equipe e cadastrar essas mesmas recompensas para cada um dos membros encontrados, conforme o código abaixo:

/* Reward Members in Team Competition, entity=competition, event=after_win */

void trigger(event, entity, player, database){

    Object competition = context.extra.item;

    Object reward_members = competition.extra.get("reward_members");

    if(reward_members != null) {

        List<Object> rewards = context.extra.rewards;

        List<Object> members = database.find('team_player', 'teamId:"'+player+'"');

        for (int x=0; x<rewards.size(); x++) {

            Object reward = rewards.get(x);

            for (int y=0; y<members.size(); y++) {

                Object member = members.get(y);

                Achievement a = new Achievement();

                a.id = Guid.newShortGuid();

                a.extra = new HashMap<String, Object>();

                a.extra.put("origin_item", competition.id);

                a.extra.put("origin_type", Achievement.TYPE_COMPETITION);

                a.player = member.linkId;

                a.total = reward.total;

                a.type = reward.type;

                a.time = new Date();

                a.item = reward.item;

                database.add(a, 'achievement');

            }

        }

    }

}