funifier-mcp 0.2.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/funifier.mdc +91 -0
- package/.github/copilot-instructions.md +83 -0
- package/AGENTS.md +97 -0
- package/README.md +247 -78
- package/datasource-funifier-docs/knowledge/guides/aggregates.md +152 -152
- package/datasource-funifier-docs/knowledge/guides/database-access.md +132 -132
- package/datasource-funifier-docs/knowledge/guides/java-entities.md +373 -373
- package/datasource-funifier-docs/knowledge/guides/java-libraries.md +330 -330
- package/datasource-funifier-docs/knowledge/guides/java-managers.md +509 -509
- package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +271 -271
- package/datasource-funifier-docs/knowledge/index.md +121 -121
- package/datasource-funifier-docs/knowledge/modules/achievement.md +46 -46
- package/datasource-funifier-docs/knowledge/modules/action-log.md +88 -88
- package/datasource-funifier-docs/knowledge/modules/action.md +80 -80
- package/datasource-funifier-docs/knowledge/modules/auth.md +104 -104
- package/datasource-funifier-docs/knowledge/modules/avatar.md +28 -28
- package/datasource-funifier-docs/knowledge/modules/backup.md +40 -40
- package/datasource-funifier-docs/knowledge/modules/challenge.md +91 -91
- package/datasource-funifier-docs/knowledge/modules/compact.md +40 -40
- package/datasource-funifier-docs/knowledge/modules/competition.md +149 -149
- package/datasource-funifier-docs/knowledge/modules/crossword.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/csv-data.md +30 -30
- package/datasource-funifier-docs/knowledge/modules/custom-object.md +53 -53
- package/datasource-funifier-docs/knowledge/modules/database.md +241 -241
- package/datasource-funifier-docs/knowledge/modules/folder.md +111 -111
- package/datasource-funifier-docs/knowledge/modules/kpi-formulas.md +23 -23
- package/datasource-funifier-docs/knowledge/modules/lastmile.md +45 -45
- package/datasource-funifier-docs/knowledge/modules/leaderboard.md +98 -98
- package/datasource-funifier-docs/knowledge/modules/level.md +83 -83
- package/datasource-funifier-docs/knowledge/modules/lottery.md +112 -112
- package/datasource-funifier-docs/knowledge/modules/marketplace.md +27 -27
- package/datasource-funifier-docs/knowledge/modules/mystery.md +82 -82
- package/datasource-funifier-docs/knowledge/modules/notification.md +40 -40
- package/datasource-funifier-docs/knowledge/modules/patterns.md +1096 -1096
- package/datasource-funifier-docs/knowledge/modules/player.md +101 -101
- package/datasource-funifier-docs/knowledge/modules/point.md +67 -67
- package/datasource-funifier-docs/knowledge/modules/public.md +253 -253
- package/datasource-funifier-docs/knowledge/modules/question.md +136 -136
- package/datasource-funifier-docs/knowledge/modules/quiz.md +163 -163
- package/datasource-funifier-docs/knowledge/modules/scheduler.md +58 -58
- package/datasource-funifier-docs/knowledge/modules/security.md +169 -169
- package/datasource-funifier-docs/knowledge/modules/staging.md +28 -28
- package/datasource-funifier-docs/knowledge/modules/static-repo.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/story.md +42 -42
- package/datasource-funifier-docs/knowledge/modules/studio-page.md +180 -180
- package/datasource-funifier-docs/knowledge/modules/swap.md +132 -132
- package/datasource-funifier-docs/knowledge/modules/team.md +75 -75
- package/datasource-funifier-docs/knowledge/modules/trigger.md +189 -189
- package/datasource-funifier-docs/knowledge/modules/upload.md +155 -155
- package/datasource-funifier-docs/knowledge/modules/virtual-good.md +99 -99
- package/datasource-funifier-docs/knowledge/modules/webhook.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/websocket.md +41 -41
- package/datasource-funifier-docs/knowledge/modules/widget.md +42 -42
- package/datasource-funifier-docs/process-gtm-saas.md +143 -143
- package/datasource-funifier-docs/process-instagram.md +88 -88
- package/datasource-funifier-docs/process.md +1826 -1826
- package/datasource-funifier-docs/readme.md +132 -132
- package/dist/cli/config-writers.js +11 -11
- package/dist/mcp/bundle.js +55 -52
- package/package.json +70 -67
- package/skills/funifier-create-aggregate/SKILL.md +126 -126
- package/skills/funifier-create-custom-page/SKILL.md +126 -126
- package/skills/funifier-create-scheduler/SKILL.md +126 -126
- package/skills/funifier-create-trigger/SKILL.md +127 -127
|
@@ -1,271 +1,271 @@
|
|
|
1
|
-
# Triggers Funifier
|
|
2
|
-
|
|
3
|
-
Triggers são códigos JAVA executados dentro do FUNIFIER ENGINE quando um evento específico acontece na gamificação. Oferecem flexibilidade para manipular informações em tempo real, permitindo mudar o comportamento padrão das técnicas de jogos e funcionalidades da plataforma.
|
|
4
|
-
|
|
5
|
-
**Acesso Studio:** `/studio/trigger`
|
|
6
|
-
**API Endpoint:** `/v3/trigger`
|
|
7
|
-
|
|
8
|
-
## Configuração de uma Trigger
|
|
9
|
-
|
|
10
|
-
Uma trigger é composta de três informações essenciais:
|
|
11
|
-
1. **Evento** (`event`): quando a trigger deve ser executada
|
|
12
|
-
2. **Entidade** (`entity`): que tipo de objeto está vinculado ao evento
|
|
13
|
-
3. **Script** (`script`): código Java a ser executado
|
|
14
|
-
|
|
15
|
-
```json
|
|
16
|
-
{
|
|
17
|
-
"name": "Make the player's name uppercase",
|
|
18
|
-
"_id": "DTv7uHc",
|
|
19
|
-
"description": "Before creating the player, change the letters of the name to uppercase",
|
|
20
|
-
"entity": "player",
|
|
21
|
-
"event": "before_create",
|
|
22
|
-
"script": "void trigger(event, entity, player, database){ entity.name = entity.name.toUpperCase(); }"
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Eventos e Entidades
|
|
27
|
-
|
|
28
|
-
### Eventos
|
|
29
|
-
|
|
30
|
-
| Evento | Quando é acionado |
|
|
31
|
-
|--------|-------------------|
|
|
32
|
-
| `before_create` | Antes de criar no banco |
|
|
33
|
-
| `after_create` | Depois de criar no banco |
|
|
34
|
-
| `before_update` | Antes de atualizar |
|
|
35
|
-
| `after_delete` | Depois de deletar |
|
|
36
|
-
| `before_win` | Antes de conquistar |
|
|
37
|
-
| `after_win` | Depois de conquistar |
|
|
38
|
-
|
|
39
|
-
### Combinações Comuns
|
|
40
|
-
|
|
41
|
-
| Evento | Entidade | Quando é acionado | Tipo do entity |
|
|
42
|
-
|--------|----------|-------------------|----------------|
|
|
43
|
-
| `before_create` | `player` | Antes de cadastrar jogador | Player |
|
|
44
|
-
| `after_create` | `player` | Depois de cadastrar jogador | Player |
|
|
45
|
-
| `before_update` | `player` | Antes de alterar jogador | Player |
|
|
46
|
-
| `after_delete` | `player` | Depois de remover jogador | Player |
|
|
47
|
-
| `after_create` | `challenge` | Depois de criar desafio | Challenge |
|
|
48
|
-
| `after_win` | `challenge` | Depois de completar desafio | Achievement |
|
|
49
|
-
| `before_create` | `action` | Antes de criar ação | Action |
|
|
50
|
-
| `before_win` | `action` | Antes de registrar action log | ActionLog |
|
|
51
|
-
| `after_win` | `level` | Depois de subir de nível | Achievement |
|
|
52
|
-
| `after_win` | `catalog_item` | Depois de comprar item | Achievement |
|
|
53
|
-
| `after_win` | `lottery` | Depois de ser sorteado | Achievement |
|
|
54
|
-
| `after_win` | `mystery_box` | Depois de ganhar prêmio surpresa | Achievement |
|
|
55
|
-
| `after_win` | `competition` | Depois de vencer competição | Achievement |
|
|
56
|
-
| `after_create` | `question_log` | Depois de responder pergunta | QuestionLog |
|
|
57
|
-
| `before_create` | `achievement` | Antes de registrar recompensa | Achievement |
|
|
58
|
-
| `before_create` | `<custom>__c` | Antes de criar objeto customizado | HashMap |
|
|
59
|
-
|
|
60
|
-
## Parâmetros do Script
|
|
61
|
-
|
|
62
|
-
```java
|
|
63
|
-
void trigger(event, entity, player, database) {
|
|
64
|
-
// event: String com o evento (ex: "before_create")
|
|
65
|
-
// entity: Objeto sendo manipulado (Player, ActionLog, Achievement, etc.)
|
|
66
|
-
// player: String com o ID do jogador
|
|
67
|
-
// database: Objeto para acessar o banco de dados
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Tipos de Objetos (entity)
|
|
72
|
-
|
|
73
|
-
### Player
|
|
74
|
-
```json
|
|
75
|
-
{"_id": "john", "name": "John Travolta", "email": "john@funifier.com", "image": {"small": {"url": "..."}, "medium": {"url": "..."}, "original": {"url": "..."}}, "teams": ["sales"], "extra": {"country": "USA", "department": "IT"}}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### ActionLog
|
|
79
|
-
```json
|
|
80
|
-
{"_id": "64a5d92", "actionId": "sell", "userId": "john", "time": {"$date": "2023-07-05T20:57:33.303Z"}, "attributes": {"product": "book", "price": 120}}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Achievement
|
|
84
|
-
```json
|
|
85
|
-
{"_id": "64a5d2", "player": "john", "total": 25.0, "type": 0, "item": "xp", "time": {"$date": "2023-07-05T20:57:33.303Z"}}
|
|
86
|
-
```
|
|
87
|
-
Tipos: `TYPE_POINT=0`, `TYPE_CHALLENGE=1`, `TYPE_VIRTUAL_GOOD=2`, `TYPE_LEVEL=3`
|
|
88
|
-
|
|
89
|
-
### Challenge
|
|
90
|
-
```json
|
|
91
|
-
{"challenge": "Watch Video", "active": true, "_id": "DTo8dS3", "rules": [{"actionId": "watch_video", "operator": 5, "total": 0}], "points": [{"total": 10.0, "category": "xp", "operation": 0}]}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Action
|
|
95
|
-
```json
|
|
96
|
-
{"_id": "sell", "action": "Sell", "attributes": [{"name": "product", "type": "String"}, {"name": "price", "type": "Number"}], "active": true}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## Managers Disponíveis
|
|
100
|
-
|
|
101
|
-
### PlayerManager
|
|
102
|
-
```java
|
|
103
|
-
Player p = manager.getPlayerManager().findById("john");
|
|
104
|
-
manager.getPlayerManager().insert(player);
|
|
105
|
-
manager.getPlayerManager().delete("john");
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### ActionManager
|
|
109
|
-
```java
|
|
110
|
-
Action a = manager.getActionManager().findActionById("sell");
|
|
111
|
-
manager.getActionManager().track(actionLog);
|
|
112
|
-
List<Achievement> results = manager.getActionManager().trackSynchronous(actionLog);
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### CatalogManager
|
|
116
|
-
```java
|
|
117
|
-
CatalogItem item = manager.getCatalogManager().findItemById("DTj7lVn");
|
|
118
|
-
manager.getCatalogManager().purchase(achievement, true);
|
|
119
|
-
manager.getCatalogManager().undoPurchase("id");
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### LotteryManager
|
|
123
|
-
```java
|
|
124
|
-
Lottery l = manager.getLotteryManager().find("DTj0x5z");
|
|
125
|
-
manager.getLotteryManager().insertTicket(ticket);
|
|
126
|
-
manager.getLotteryManager().execute("DTj0x5z");
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### AchievementManager
|
|
130
|
-
```java
|
|
131
|
-
Achievement a = new Achievement();
|
|
132
|
-
a.player = "john"; a.total = 10; a.type = 0; a.item = "xp";
|
|
133
|
-
a.time = new Date(); a._id = Guid.newShortGuid();
|
|
134
|
-
manager.getAchievementManager().addAchievement(a);
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### Acesso ao Banco de Dados (Jongo)
|
|
138
|
-
```java
|
|
139
|
-
// Salvar
|
|
140
|
-
manager.getJongoConnection().getCollection("email__c").save(payload);
|
|
141
|
-
|
|
142
|
-
// Buscar
|
|
143
|
-
Object result = manager.getJongoConnection().getCollection("player").findOne("{_id: 'john'}").as(Object.class);
|
|
144
|
-
|
|
145
|
-
// Deletar
|
|
146
|
-
manager.getJongoConnection().getCollection("car__c").remove("{_id: 'car001'}");
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
## Exemplos de Código
|
|
150
|
-
|
|
151
|
-
### Exemplo 1: Duplicar pontos para jogadores de TI
|
|
152
|
-
|
|
153
|
-
```java
|
|
154
|
-
/* "event": "before_create", "entity": "achievement" */
|
|
155
|
-
void trigger(event, entity, player, database) {
|
|
156
|
-
if(entity.type == Achievement.TYPE_POINT) {
|
|
157
|
-
Player currentPlayer = manager.getPlayerManager().findById(player);
|
|
158
|
-
if("IT".equals(currentPlayer.extra.department)) {
|
|
159
|
-
entity.total = entity.total * 2;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
### Exemplo 2: Dar ponto para todos os amigos
|
|
166
|
-
|
|
167
|
-
```java
|
|
168
|
-
/* "event": "before_create", "entity": "achievement" */
|
|
169
|
-
void trigger(event, entity, player, database) {
|
|
170
|
-
if(entity.type == Achievement.TYPE_POINT && entity.total >= 100) {
|
|
171
|
-
Player p = manager.getPlayerManager().findById(player);
|
|
172
|
-
for(String friend : p.friends) {
|
|
173
|
-
Achievement a = new Achievement();
|
|
174
|
-
a.player = friend; a.total = 1; a.type = 0;
|
|
175
|
-
a.item = entity.item; a.time = new Date();
|
|
176
|
-
a._id = Guid.newShortGuid();
|
|
177
|
-
manager.getAchievementManager().addAchievement(a);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### Exemplo 3: Enviar email de boas-vindas
|
|
184
|
-
|
|
185
|
-
```java
|
|
186
|
-
/* "event": "after_create", "entity": "player" */
|
|
187
|
-
void trigger(event, entity, player, database) {
|
|
188
|
-
long total = manager.getPlayerManager().findTotal();
|
|
189
|
-
Email email = EmailBuilder
|
|
190
|
-
.startingBlank()
|
|
191
|
-
.from("Company", "your@company.com")
|
|
192
|
-
.to(entity.getName(), entity.email)
|
|
193
|
-
.withSubject("Welcome!")
|
|
194
|
-
.withPlainText("Welcome " + entity.name + ", you are member number " + total)
|
|
195
|
-
.buildEmail();
|
|
196
|
-
MailerBuilder.withSMTPServer("host", 587, "login", "password")
|
|
197
|
-
.buildMailer().sendMail(email);
|
|
198
|
-
}
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
### Exemplo 4: Requisição HTTP com Unirest
|
|
202
|
-
|
|
203
|
-
```java
|
|
204
|
-
/* "event": "after_win", "entity": "catalog_item" */
|
|
205
|
-
void trigger(event, entity, player, database) {
|
|
206
|
-
Player buyer = manager.getPlayerManager().findById(entity.player);
|
|
207
|
-
CatalogItem item = manager.getCatalogManager().findItemById(entity.item);
|
|
208
|
-
HashMap zap = new HashMap();
|
|
209
|
-
zap.put("purchase", entity);
|
|
210
|
-
zap.put("buyer", buyer);
|
|
211
|
-
zap.put("item", item);
|
|
212
|
-
HttpResponse<String> response = Unirest.post("https://hooks.zapier.com/hooks/catch/80/b6/")
|
|
213
|
-
.header("Content-Type", "application/json")
|
|
214
|
-
.body(JsonUtil.toJson(zap))
|
|
215
|
-
.asString();
|
|
216
|
-
}
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
### Exemplo 5: Criar código de convite
|
|
220
|
-
|
|
221
|
-
```java
|
|
222
|
-
/* "event": "before_create", "entity": "player" */
|
|
223
|
-
void trigger(event, entity, player, database) {
|
|
224
|
-
String code = Guid.shortTimeMillis();
|
|
225
|
-
entity.extra.put("code", code);
|
|
226
|
-
}
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
### Exemplo 6: Consultar objeto no banco
|
|
230
|
-
|
|
231
|
-
```java
|
|
232
|
-
/* "event": "before_win", "entity": "action" */
|
|
233
|
-
void trigger(event, entity, player, database) {
|
|
234
|
-
String id = entity.attributes.product;
|
|
235
|
-
Object product = database.getCollection("product__c").findOne("{_id:#}", id).as(Object.class);
|
|
236
|
-
entity.attributes.put("price", product.price);
|
|
237
|
-
}
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
### Exemplo 7: Executar aggregate no banco
|
|
241
|
-
|
|
242
|
-
```java
|
|
243
|
-
/* "event": "before_win", "entity": "action" */
|
|
244
|
-
void trigger(event, entity, player, database) {
|
|
245
|
-
org.jongo.MongoCollection collection = database.getCollection("achievement");
|
|
246
|
-
List<Object> highest = Arrays.asList(
|
|
247
|
-
collection.aggregate("{\"$match\": {\"type\": 0, \"item\": \"xp\"}}")
|
|
248
|
-
.and("{\"$group\": {\"_id\": \"$player\", \"total\": {\"$sum\": \"$total\"}}}")
|
|
249
|
-
.and("{\"$sort\": {\"total\": -1}}")
|
|
250
|
-
.and("{\"$limit\":1}")
|
|
251
|
-
.as(Object.class));
|
|
252
|
-
if(highest != null && highest.size() > 0) {
|
|
253
|
-
Object highestPointsPlayer = highest.get(0);
|
|
254
|
-
entity.attributes.put("highest", highestPointsPlayer.total);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
## Bibliotecas Disponíveis
|
|
260
|
-
|
|
261
|
-
- **org.simplejavamail** - Envio de emails
|
|
262
|
-
- **com.mashape.unirest** - Requisições HTTP
|
|
263
|
-
- **org.jongo** - Acesso ao MongoDB
|
|
264
|
-
- **JsonUtil** - Conversão JSON
|
|
265
|
-
- **Guid** - Geração de IDs únicos
|
|
266
|
-
- **DateUtil** - Cálculos e expressões de data
|
|
267
|
-
|
|
268
|
-
> **Referência completa:** Para detalhes de todos os managers, entidades e bibliotecas disponíveis em Java, consulte:
|
|
269
|
-
> - `guides/java-managers.md` — Todos os managers e seus métodos
|
|
270
|
-
> - `guides/java-entities.md` — Entidades, campos e coleções MongoDB
|
|
271
|
-
> - `guides/java-libraries.md` — JsonUtil, Guid, DateUtil, Unirest, EmailBuilder, Jongo
|
|
1
|
+
# Triggers Funifier
|
|
2
|
+
|
|
3
|
+
Triggers são códigos JAVA executados dentro do FUNIFIER ENGINE quando um evento específico acontece na gamificação. Oferecem flexibilidade para manipular informações em tempo real, permitindo mudar o comportamento padrão das técnicas de jogos e funcionalidades da plataforma.
|
|
4
|
+
|
|
5
|
+
**Acesso Studio:** `/studio/trigger`
|
|
6
|
+
**API Endpoint:** `/v3/trigger`
|
|
7
|
+
|
|
8
|
+
## Configuração de uma Trigger
|
|
9
|
+
|
|
10
|
+
Uma trigger é composta de três informações essenciais:
|
|
11
|
+
1. **Evento** (`event`): quando a trigger deve ser executada
|
|
12
|
+
2. **Entidade** (`entity`): que tipo de objeto está vinculado ao evento
|
|
13
|
+
3. **Script** (`script`): código Java a ser executado
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"name": "Make the player's name uppercase",
|
|
18
|
+
"_id": "DTv7uHc",
|
|
19
|
+
"description": "Before creating the player, change the letters of the name to uppercase",
|
|
20
|
+
"entity": "player",
|
|
21
|
+
"event": "before_create",
|
|
22
|
+
"script": "void trigger(event, entity, player, database){ entity.name = entity.name.toUpperCase(); }"
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Eventos e Entidades
|
|
27
|
+
|
|
28
|
+
### Eventos
|
|
29
|
+
|
|
30
|
+
| Evento | Quando é acionado |
|
|
31
|
+
|--------|-------------------|
|
|
32
|
+
| `before_create` | Antes de criar no banco |
|
|
33
|
+
| `after_create` | Depois de criar no banco |
|
|
34
|
+
| `before_update` | Antes de atualizar |
|
|
35
|
+
| `after_delete` | Depois de deletar |
|
|
36
|
+
| `before_win` | Antes de conquistar |
|
|
37
|
+
| `after_win` | Depois de conquistar |
|
|
38
|
+
|
|
39
|
+
### Combinações Comuns
|
|
40
|
+
|
|
41
|
+
| Evento | Entidade | Quando é acionado | Tipo do entity |
|
|
42
|
+
|--------|----------|-------------------|----------------|
|
|
43
|
+
| `before_create` | `player` | Antes de cadastrar jogador | Player |
|
|
44
|
+
| `after_create` | `player` | Depois de cadastrar jogador | Player |
|
|
45
|
+
| `before_update` | `player` | Antes de alterar jogador | Player |
|
|
46
|
+
| `after_delete` | `player` | Depois de remover jogador | Player |
|
|
47
|
+
| `after_create` | `challenge` | Depois de criar desafio | Challenge |
|
|
48
|
+
| `after_win` | `challenge` | Depois de completar desafio | Achievement |
|
|
49
|
+
| `before_create` | `action` | Antes de criar ação | Action |
|
|
50
|
+
| `before_win` | `action` | Antes de registrar action log | ActionLog |
|
|
51
|
+
| `after_win` | `level` | Depois de subir de nível | Achievement |
|
|
52
|
+
| `after_win` | `catalog_item` | Depois de comprar item | Achievement |
|
|
53
|
+
| `after_win` | `lottery` | Depois de ser sorteado | Achievement |
|
|
54
|
+
| `after_win` | `mystery_box` | Depois de ganhar prêmio surpresa | Achievement |
|
|
55
|
+
| `after_win` | `competition` | Depois de vencer competição | Achievement |
|
|
56
|
+
| `after_create` | `question_log` | Depois de responder pergunta | QuestionLog |
|
|
57
|
+
| `before_create` | `achievement` | Antes de registrar recompensa | Achievement |
|
|
58
|
+
| `before_create` | `<custom>__c` | Antes de criar objeto customizado | HashMap |
|
|
59
|
+
|
|
60
|
+
## Parâmetros do Script
|
|
61
|
+
|
|
62
|
+
```java
|
|
63
|
+
void trigger(event, entity, player, database) {
|
|
64
|
+
// event: String com o evento (ex: "before_create")
|
|
65
|
+
// entity: Objeto sendo manipulado (Player, ActionLog, Achievement, etc.)
|
|
66
|
+
// player: String com o ID do jogador
|
|
67
|
+
// database: Objeto para acessar o banco de dados
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Tipos de Objetos (entity)
|
|
72
|
+
|
|
73
|
+
### Player
|
|
74
|
+
```json
|
|
75
|
+
{"_id": "john", "name": "John Travolta", "email": "john@funifier.com", "image": {"small": {"url": "..."}, "medium": {"url": "..."}, "original": {"url": "..."}}, "teams": ["sales"], "extra": {"country": "USA", "department": "IT"}}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### ActionLog
|
|
79
|
+
```json
|
|
80
|
+
{"_id": "64a5d92", "actionId": "sell", "userId": "john", "time": {"$date": "2023-07-05T20:57:33.303Z"}, "attributes": {"product": "book", "price": 120}}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Achievement
|
|
84
|
+
```json
|
|
85
|
+
{"_id": "64a5d2", "player": "john", "total": 25.0, "type": 0, "item": "xp", "time": {"$date": "2023-07-05T20:57:33.303Z"}}
|
|
86
|
+
```
|
|
87
|
+
Tipos: `TYPE_POINT=0`, `TYPE_CHALLENGE=1`, `TYPE_VIRTUAL_GOOD=2`, `TYPE_LEVEL=3`
|
|
88
|
+
|
|
89
|
+
### Challenge
|
|
90
|
+
```json
|
|
91
|
+
{"challenge": "Watch Video", "active": true, "_id": "DTo8dS3", "rules": [{"actionId": "watch_video", "operator": 5, "total": 0}], "points": [{"total": 10.0, "category": "xp", "operation": 0}]}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Action
|
|
95
|
+
```json
|
|
96
|
+
{"_id": "sell", "action": "Sell", "attributes": [{"name": "product", "type": "String"}, {"name": "price", "type": "Number"}], "active": true}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Managers Disponíveis
|
|
100
|
+
|
|
101
|
+
### PlayerManager
|
|
102
|
+
```java
|
|
103
|
+
Player p = manager.getPlayerManager().findById("john");
|
|
104
|
+
manager.getPlayerManager().insert(player);
|
|
105
|
+
manager.getPlayerManager().delete("john");
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### ActionManager
|
|
109
|
+
```java
|
|
110
|
+
Action a = manager.getActionManager().findActionById("sell");
|
|
111
|
+
manager.getActionManager().track(actionLog);
|
|
112
|
+
List<Achievement> results = manager.getActionManager().trackSynchronous(actionLog);
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### CatalogManager
|
|
116
|
+
```java
|
|
117
|
+
CatalogItem item = manager.getCatalogManager().findItemById("DTj7lVn");
|
|
118
|
+
manager.getCatalogManager().purchase(achievement, true);
|
|
119
|
+
manager.getCatalogManager().undoPurchase("id");
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### LotteryManager
|
|
123
|
+
```java
|
|
124
|
+
Lottery l = manager.getLotteryManager().find("DTj0x5z");
|
|
125
|
+
manager.getLotteryManager().insertTicket(ticket);
|
|
126
|
+
manager.getLotteryManager().execute("DTj0x5z");
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### AchievementManager
|
|
130
|
+
```java
|
|
131
|
+
Achievement a = new Achievement();
|
|
132
|
+
a.player = "john"; a.total = 10; a.type = 0; a.item = "xp";
|
|
133
|
+
a.time = new Date(); a._id = Guid.newShortGuid();
|
|
134
|
+
manager.getAchievementManager().addAchievement(a);
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Acesso ao Banco de Dados (Jongo)
|
|
138
|
+
```java
|
|
139
|
+
// Salvar
|
|
140
|
+
manager.getJongoConnection().getCollection("email__c").save(payload);
|
|
141
|
+
|
|
142
|
+
// Buscar
|
|
143
|
+
Object result = manager.getJongoConnection().getCollection("player").findOne("{_id: 'john'}").as(Object.class);
|
|
144
|
+
|
|
145
|
+
// Deletar
|
|
146
|
+
manager.getJongoConnection().getCollection("car__c").remove("{_id: 'car001'}");
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Exemplos de Código
|
|
150
|
+
|
|
151
|
+
### Exemplo 1: Duplicar pontos para jogadores de TI
|
|
152
|
+
|
|
153
|
+
```java
|
|
154
|
+
/* "event": "before_create", "entity": "achievement" */
|
|
155
|
+
void trigger(event, entity, player, database) {
|
|
156
|
+
if(entity.type == Achievement.TYPE_POINT) {
|
|
157
|
+
Player currentPlayer = manager.getPlayerManager().findById(player);
|
|
158
|
+
if("IT".equals(currentPlayer.extra.department)) {
|
|
159
|
+
entity.total = entity.total * 2;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Exemplo 2: Dar ponto para todos os amigos
|
|
166
|
+
|
|
167
|
+
```java
|
|
168
|
+
/* "event": "before_create", "entity": "achievement" */
|
|
169
|
+
void trigger(event, entity, player, database) {
|
|
170
|
+
if(entity.type == Achievement.TYPE_POINT && entity.total >= 100) {
|
|
171
|
+
Player p = manager.getPlayerManager().findById(player);
|
|
172
|
+
for(String friend : p.friends) {
|
|
173
|
+
Achievement a = new Achievement();
|
|
174
|
+
a.player = friend; a.total = 1; a.type = 0;
|
|
175
|
+
a.item = entity.item; a.time = new Date();
|
|
176
|
+
a._id = Guid.newShortGuid();
|
|
177
|
+
manager.getAchievementManager().addAchievement(a);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Exemplo 3: Enviar email de boas-vindas
|
|
184
|
+
|
|
185
|
+
```java
|
|
186
|
+
/* "event": "after_create", "entity": "player" */
|
|
187
|
+
void trigger(event, entity, player, database) {
|
|
188
|
+
long total = manager.getPlayerManager().findTotal();
|
|
189
|
+
Email email = EmailBuilder
|
|
190
|
+
.startingBlank()
|
|
191
|
+
.from("Company", "your@company.com")
|
|
192
|
+
.to(entity.getName(), entity.email)
|
|
193
|
+
.withSubject("Welcome!")
|
|
194
|
+
.withPlainText("Welcome " + entity.name + ", you are member number " + total)
|
|
195
|
+
.buildEmail();
|
|
196
|
+
MailerBuilder.withSMTPServer("host", 587, "login", "password")
|
|
197
|
+
.buildMailer().sendMail(email);
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Exemplo 4: Requisição HTTP com Unirest
|
|
202
|
+
|
|
203
|
+
```java
|
|
204
|
+
/* "event": "after_win", "entity": "catalog_item" */
|
|
205
|
+
void trigger(event, entity, player, database) {
|
|
206
|
+
Player buyer = manager.getPlayerManager().findById(entity.player);
|
|
207
|
+
CatalogItem item = manager.getCatalogManager().findItemById(entity.item);
|
|
208
|
+
HashMap zap = new HashMap();
|
|
209
|
+
zap.put("purchase", entity);
|
|
210
|
+
zap.put("buyer", buyer);
|
|
211
|
+
zap.put("item", item);
|
|
212
|
+
HttpResponse<String> response = Unirest.post("https://hooks.zapier.com/hooks/catch/80/b6/")
|
|
213
|
+
.header("Content-Type", "application/json")
|
|
214
|
+
.body(JsonUtil.toJson(zap))
|
|
215
|
+
.asString();
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Exemplo 5: Criar código de convite
|
|
220
|
+
|
|
221
|
+
```java
|
|
222
|
+
/* "event": "before_create", "entity": "player" */
|
|
223
|
+
void trigger(event, entity, player, database) {
|
|
224
|
+
String code = Guid.shortTimeMillis();
|
|
225
|
+
entity.extra.put("code", code);
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Exemplo 6: Consultar objeto no banco
|
|
230
|
+
|
|
231
|
+
```java
|
|
232
|
+
/* "event": "before_win", "entity": "action" */
|
|
233
|
+
void trigger(event, entity, player, database) {
|
|
234
|
+
String id = entity.attributes.product;
|
|
235
|
+
Object product = database.getCollection("product__c").findOne("{_id:#}", id).as(Object.class);
|
|
236
|
+
entity.attributes.put("price", product.price);
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Exemplo 7: Executar aggregate no banco
|
|
241
|
+
|
|
242
|
+
```java
|
|
243
|
+
/* "event": "before_win", "entity": "action" */
|
|
244
|
+
void trigger(event, entity, player, database) {
|
|
245
|
+
org.jongo.MongoCollection collection = database.getCollection("achievement");
|
|
246
|
+
List<Object> highest = Arrays.asList(
|
|
247
|
+
collection.aggregate("{\"$match\": {\"type\": 0, \"item\": \"xp\"}}")
|
|
248
|
+
.and("{\"$group\": {\"_id\": \"$player\", \"total\": {\"$sum\": \"$total\"}}}")
|
|
249
|
+
.and("{\"$sort\": {\"total\": -1}}")
|
|
250
|
+
.and("{\"$limit\":1}")
|
|
251
|
+
.as(Object.class));
|
|
252
|
+
if(highest != null && highest.size() > 0) {
|
|
253
|
+
Object highestPointsPlayer = highest.get(0);
|
|
254
|
+
entity.attributes.put("highest", highestPointsPlayer.total);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Bibliotecas Disponíveis
|
|
260
|
+
|
|
261
|
+
- **org.simplejavamail** - Envio de emails
|
|
262
|
+
- **com.mashape.unirest** - Requisições HTTP
|
|
263
|
+
- **org.jongo** - Acesso ao MongoDB
|
|
264
|
+
- **JsonUtil** - Conversão JSON
|
|
265
|
+
- **Guid** - Geração de IDs únicos
|
|
266
|
+
- **DateUtil** - Cálculos e expressões de data
|
|
267
|
+
|
|
268
|
+
> **Referência completa:** Para detalhes de todos os managers, entidades e bibliotecas disponíveis em Java, consulte:
|
|
269
|
+
> - `guides/java-managers.md` — Todos os managers e seus métodos
|
|
270
|
+
> - `guides/java-entities.md` — Entidades, campos e coleções MongoDB
|
|
271
|
+
> - `guides/java-libraries.md` — JsonUtil, Guid, DateUtil, Unirest, EmailBuilder, Jongo
|