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.
Files changed (64) hide show
  1. package/.cursor/rules/funifier.mdc +91 -0
  2. package/.github/copilot-instructions.md +83 -0
  3. package/AGENTS.md +97 -0
  4. package/README.md +247 -78
  5. package/datasource-funifier-docs/knowledge/guides/aggregates.md +152 -152
  6. package/datasource-funifier-docs/knowledge/guides/database-access.md +132 -132
  7. package/datasource-funifier-docs/knowledge/guides/java-entities.md +373 -373
  8. package/datasource-funifier-docs/knowledge/guides/java-libraries.md +330 -330
  9. package/datasource-funifier-docs/knowledge/guides/java-managers.md +509 -509
  10. package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +271 -271
  11. package/datasource-funifier-docs/knowledge/index.md +121 -121
  12. package/datasource-funifier-docs/knowledge/modules/achievement.md +46 -46
  13. package/datasource-funifier-docs/knowledge/modules/action-log.md +88 -88
  14. package/datasource-funifier-docs/knowledge/modules/action.md +80 -80
  15. package/datasource-funifier-docs/knowledge/modules/auth.md +104 -104
  16. package/datasource-funifier-docs/knowledge/modules/avatar.md +28 -28
  17. package/datasource-funifier-docs/knowledge/modules/backup.md +40 -40
  18. package/datasource-funifier-docs/knowledge/modules/challenge.md +91 -91
  19. package/datasource-funifier-docs/knowledge/modules/compact.md +40 -40
  20. package/datasource-funifier-docs/knowledge/modules/competition.md +149 -149
  21. package/datasource-funifier-docs/knowledge/modules/crossword.md +41 -41
  22. package/datasource-funifier-docs/knowledge/modules/csv-data.md +30 -30
  23. package/datasource-funifier-docs/knowledge/modules/custom-object.md +53 -53
  24. package/datasource-funifier-docs/knowledge/modules/database.md +241 -241
  25. package/datasource-funifier-docs/knowledge/modules/folder.md +111 -111
  26. package/datasource-funifier-docs/knowledge/modules/kpi-formulas.md +23 -23
  27. package/datasource-funifier-docs/knowledge/modules/lastmile.md +45 -45
  28. package/datasource-funifier-docs/knowledge/modules/leaderboard.md +98 -98
  29. package/datasource-funifier-docs/knowledge/modules/level.md +83 -83
  30. package/datasource-funifier-docs/knowledge/modules/lottery.md +112 -112
  31. package/datasource-funifier-docs/knowledge/modules/marketplace.md +27 -27
  32. package/datasource-funifier-docs/knowledge/modules/mystery.md +82 -82
  33. package/datasource-funifier-docs/knowledge/modules/notification.md +40 -40
  34. package/datasource-funifier-docs/knowledge/modules/patterns.md +1096 -1096
  35. package/datasource-funifier-docs/knowledge/modules/player.md +101 -101
  36. package/datasource-funifier-docs/knowledge/modules/point.md +67 -67
  37. package/datasource-funifier-docs/knowledge/modules/public.md +253 -253
  38. package/datasource-funifier-docs/knowledge/modules/question.md +136 -136
  39. package/datasource-funifier-docs/knowledge/modules/quiz.md +163 -163
  40. package/datasource-funifier-docs/knowledge/modules/scheduler.md +58 -58
  41. package/datasource-funifier-docs/knowledge/modules/security.md +169 -169
  42. package/datasource-funifier-docs/knowledge/modules/staging.md +28 -28
  43. package/datasource-funifier-docs/knowledge/modules/static-repo.md +41 -41
  44. package/datasource-funifier-docs/knowledge/modules/story.md +42 -42
  45. package/datasource-funifier-docs/knowledge/modules/studio-page.md +180 -180
  46. package/datasource-funifier-docs/knowledge/modules/swap.md +132 -132
  47. package/datasource-funifier-docs/knowledge/modules/team.md +75 -75
  48. package/datasource-funifier-docs/knowledge/modules/trigger.md +189 -189
  49. package/datasource-funifier-docs/knowledge/modules/upload.md +155 -155
  50. package/datasource-funifier-docs/knowledge/modules/virtual-good.md +99 -99
  51. package/datasource-funifier-docs/knowledge/modules/webhook.md +41 -41
  52. package/datasource-funifier-docs/knowledge/modules/websocket.md +41 -41
  53. package/datasource-funifier-docs/knowledge/modules/widget.md +42 -42
  54. package/datasource-funifier-docs/process-gtm-saas.md +143 -143
  55. package/datasource-funifier-docs/process-instagram.md +88 -88
  56. package/datasource-funifier-docs/process.md +1826 -1826
  57. package/datasource-funifier-docs/readme.md +132 -132
  58. package/dist/cli/config-writers.js +11 -11
  59. package/dist/mcp/bundle.js +55 -52
  60. package/package.json +70 -67
  61. package/skills/funifier-create-aggregate/SKILL.md +126 -126
  62. package/skills/funifier-create-custom-page/SKILL.md +126 -126
  63. package/skills/funifier-create-scheduler/SKILL.md +126 -126
  64. 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