· 7 years ago · Mar 21, 2019, 09:54 PM
1package it.edoardozito.bot;
2
3import com.google.gson.JsonElement;
4import com.google.gson.JsonObject;
5import com.google.gson.JsonParser;
6import com.google.zxing.BarcodeFormat;
7import com.google.zxing.EncodeHintType;
8import com.google.zxing.WriterException;
9import com.google.zxing.common.BitMatrix;
10import com.google.zxing.qrcode.QRCodeWriter;
11import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
12import io.github.ageofwar.telejam.Bot;
13import io.github.ageofwar.telejam.connection.UploadFile;
14import io.github.ageofwar.telejam.messages.TextMessage;
15import io.github.ageofwar.telejam.messages.TextMessageHandler;
16import io.github.ageofwar.telejam.methods.SendMessage;
17import io.github.ageofwar.telejam.methods.SendPhoto;
18import io.github.ageofwar.telejam.replymarkups.ReplyKeyboardMarkup;
19import io.github.ageofwar.telejam.users.User;
20import org.jsoup.Jsoup;
21import org.jsoup.nodes.Element;
22
23import javax.imageio.ImageIO;
24import java.awt.*;
25import java.awt.image.BufferedImage;
26import java.io.ByteArrayInputStream;
27import java.io.ByteArrayOutputStream;
28import java.io.IOException;
29import java.io.InputStream;
30import java.util.EnumMap;
31import java.util.Map;
32
33public class OffersHandler implements TextMessageHandler{
34
35 private Bot bot;
36 public OffersHandler(Bot bot){
37 this.bot = bot;
38 }
39
40 // Evento per la gestione del messaggio ricevuto in input dal bot
41
42
43 @Override
44 public void onTextMessage(TextMessage textMessage) throws Throwable {
45
46 User sender = textMessage.getSender();
47 SendMessage sendMessage = new SendMessage();
48
49 if(!sender.getUsername().isPresent()){
50 sendMessage.replyToMessage(textMessage).text("Prima di utilizzare questo bot sei pregato di impostare un username.");
51 bot.execute(sendMessage);
52 return;
53 }
54
55 if(textMessage.getText().toString().equalsIgnoreCase("/start")){
56 sendMessage = new SendMessage()
57 .replyToMessage(textMessage)
58 .text("Benvenuto ciccione, scegli l'offerta che vuoi. Non mangiare troppo faccia di merda \uD83D\uDCA9");
59 ReplyKeyboardMarkup keyboardMarkup = new ReplyKeyboardMarkup(new String[][]{
60 {"Crispy McBacon® o McChicken®"},
61 {"2 McMenu® Small + 6 Chicken McNuggets®"},
62 {"McFlurry®"},
63 {"9 Chicken McNuggets®"},
64 {"Le Ricche®"},
65 {"McMenu® Large"},
66 {"McMenu® Large McChicken®"},
67 {"Menu Granmattino"},
68 {"Big Mac® Large"},
69 {"Double Cheeseburger o Double Chicken BBQ"},
70 {"Caffè"}
71 });
72 sendMessage.replyMarkup(keyboardMarkup);
73 bot.execute(sendMessage);
74
75 }
76 else {
77 SendPhoto sendPhoto = new SendPhoto();
78 OfferWrapper offer = new OfferWrapper();
79 switch (textMessage.getText().toString()) {
80 case "Crispy McBacon® o McChicken®":
81 offer = getOfferForUser(10983);
82 if(offer == null)
83 break;
84 sendPhoto.photo(new UploadFile("a", offer.getInputStream()));
85 break;
86 case "Le Ricche®":
87 offer = getOfferForUser(13556);
88 if(offer == null)
89 break;
90 sendPhoto.photo(new UploadFile("a", offer.getInputStream()));
91 break;
92 case "9 Chicken McNuggets®":
93 offer = getOfferForUser(12529);
94 if(offer == null)
95 break;
96 sendPhoto.photo(new UploadFile("a", offer.getInputStream()));
97 break;
98 case "McFlurry®":
99 offer = getOfferForUser(13573);
100 if(offer == null)
101 break;
102 sendPhoto.photo(new UploadFile("a", offer.getInputStream()));
103 break;
104 case "2 McMenu® Small + 6 Chicken McNuggets®":
105 offer = getOfferForUser(13558);
106 if(offer == null)
107 break;
108 sendPhoto.photo(new UploadFile("a", offer.getInputStream()));
109 break;
110 case "McMenu® Large":
111 offer = getOfferForUser(12814);
112 if(offer == null)
113 break;
114 sendPhoto.photo(new UploadFile("a", offer.getInputStream()));
115 break;
116 case "McMenu® Large McChicken®":
117 offer = getOfferForUser(13680);
118 if(offer == null)
119 break;
120 sendPhoto.photo(new UploadFile("a", offer.getInputStream()));
121 break;
122 case "Menu Granmattino":
123 offer = getOfferForUser(13571);
124 if(offer == null)
125 break;
126 sendPhoto.photo(new UploadFile("a", offer.getInputStream()));
127 break;
128 case "Big Mac® Large":
129 offer = getOfferForUser(13570);
130 if(offer == null)
131 break;
132 sendPhoto.photo(new UploadFile("a", offer.getInputStream()));
133 break;
134 case "Double Cheeseburger o Double Chicken BBQ":
135 offer = getOfferForUser(10984);
136 if(offer == null)
137 break;
138 sendPhoto.photo(new UploadFile("a", offer.getInputStream()));
139 break;
140 case "Caffè":
141 offer = getOfferForUser(0);
142 if(offer == null)
143 break;
144 sendPhoto.photo(new UploadFile("a",offer.getInputStream()));
145 break;
146 default:
147 sendMessage.replyToMessage(textMessage).text("Offerta non trovata.");
148 bot.execute(sendMessage);
149 return;
150 }
151 if(offer != null) {
152 bot.execute(sendPhoto);
153 }
154 }
155
156 }
157
158 // Genera un OfferWrapper avendo il codice dell'offerta
159
160 public static OfferWrapper getOfferForUser(int code) {
161 //COFFEE
162 if(code == 0){
163 try {
164 Element j = Jsoup
165 .connect("https://survey.fast-insight.com/mcd/it/voucher_coffee_aug.php")
166 .data("lang","it")
167 .data("store_id","0461")
168 .data("deviceAPP_ID","undefined")
169 .data("transaction","undefined")
170 .data("IP","undefined")
171 .data("browserLANG","undefined")
172 .data("deviceType","undefined")
173 .data("browseR","undefined")
174 .data("version","undefined")
175 .data("platform","undefined")
176 .data("surveyform","undefined")
177 .data("browseR","undefined")
178 .data("identifier","undefined")
179 .data("promo",randomAlphaNumeric(13))
180 .data("incentivetype","2")
181 .data("orderpoint","1")
182 .ignoreContentType(true).post();
183
184 BufferedImage a = generateQR(j.getElementsByAttributeValue("name","code").val());
185 ByteArrayOutputStream os = new ByteArrayOutputStream();
186 ImageIO.write(a, "gif", os);
187 InputStream is = new ByteArrayInputStream(os.toByteArray());
188 os.close();
189
190 JsonParser parser = new JsonParser();
191 JsonObject element = (JsonObject) parser.parse("{\n" +
192 " \"redemptionText\": \""+j.getElementsByAttributeValue("name","code").val()+"\",\n" +
193 " \"title\": \"Caffè\"\n" +
194 "}");
195 return new OfferWrapper(is,element);
196
197 } catch (IOException e) {
198 e.printStackTrace();
199 }
200 }
201
202 String mail = randomAlphaNumeric(6) + "@gmail.com";
203 String password = "xnsOSijjew092399uwi";
204
205 String json = "{\"emailRegistration\":{\"emailAddress\":\"" + mail + "\",\"firstName\":\"asddvddasvdsa\",\"gender\":\"\",\"lastName\":\"vdsadvdads\",\"password\":\"" + password + "\",\"tagValueAddReferenceCodes\":[\"merchantId587\"]}," +
206 "\"grant_type\":\"password\",\"password\":\"" + password + "\",\"username\":\"" + mail + "\"}";
207
208
209 try {
210 Element j = Jsoup
211 .connect("https://con-West-Europe-GMA.vmobapps.com/v3/emailRegistrations")
212 .header("x-vmob-location_longitude", "")
213 .header("x-vmob-device_network_type", "wifi")
214 .header("x-vmob-authorization", "5853342c-d3ef-421c-b23d-5c6036b8ebd5")
215 .header("x-vmob-device_utc_offset", "+1:00")
216 .header("x-vmob-sdk_version", "4.36.3")
217 .header("x-vmob-device_screen_resolution", "720x1280")
218 .header("x-vmob-device_type", "a")
219 .header("Accept-Language", "it-IT")
220 .header("x-vmob-device", "Lenovo Lenovo Z90-3")
221 .header("Authorization", "bearer 2cbc8d688143e6e4af9597b7d25e8c36d7e11ec549ddaf878ae72696f5250316")
222 .header("x-vmob-location_latitude", "")
223 .header("x-vmob-uid", "a6Gb3zVRMcNtqbDSZ_J_" + randomAlphaNumeric(13) + "-05p0zI4jHVm3C9JznspQ==_")
224 .header("x-vmob-beacons", "")
225 .header("x-vmob-device_os_version", "4.4.2")
226 .header("x-vmob-application_version", "2464")
227 .header("x-vmob-cost-center", "merchantId587")
228 .header("x-vmob-mobile_operator", "T-Mobile")
229 .header("x-vmob-device_timezone_id", "Africa/Brazzaville")
230 .header("Accept", "application/json")
231 .header("x-vmob-location_accuracy", "")
232 .header("Content-Type", "application/json")
233 .header("User-Agent", "Dalvik/1.6.0 (Linux; U; Android 4.4.2; Lenovo Z90-3 Build/LRX22G)")
234 .header("Host", "con-West-Europe-GMA.vmobapps.com")
235 .header("Connection", "Keep-Alive")
236 .header("Accept-Encoding", "gzip")
237 .header("Content-Length", json.length() + "")
238 .requestBody(json).ignoreContentType(true).post().body();
239
240
241 String toke = "";
242
243
244 String jsonnn = j.text();
245 JsonParser parser = new JsonParser();
246 JsonObject element = (JsonObject) parser.parse(jsonnn);
247
248 JsonElement responseWrapper = element.get("access_token");
249 toke = responseWrapper.toString().replace("\"", "");
250
251 String x = "{\"offerId\":"+code+"}";
252
253 j = Jsoup.
254 connect("https://con-West-Europe-GMA.vmobapps.com/v3/consumers/redeemedOffers")
255 .header("x-vmob-location_longitude", "")
256 .header("x-vmob-device_network_type", "wifi")
257 .header("x-vmob-authorization", "5853342c-d3ef-421c-b23d-5c6036b8ebd5")
258 .header("x-vmob-device_utc_offset", "+1:00")
259 .header("x-vmob-sdk_version", "4.36.3")
260 .header("x-vmob-device_screen_resolution", "720x1280")
261 .header("x-vmob-device_type", "a")
262 .header("Accept-Language", "it-IT")
263 .header("x-vmob-device", "Lenovo Lenovo Z90-3")
264 .header("Authorization", "bearer " + toke)
265 .header("x-vmob-location_latitude", "")
266 .header("x-vmob-uid", "a6Gb3zVRMcNtqbDSZ_J_" + randomAlphaNumeric(13) + "-05p0zI4jHVm3C9JznspQ==_")
267 .header("x-vmob-beacons", "")
268 .header("x-vmob-device_os_version", "4.4.2")
269 .header("x-vmob-application_version", "2464")
270 .header("x-vmob-cost-center", "merchantId587")
271 .header("x-vmob-mobile_operator", "T-Mobile")
272 .header("x-vmob-device_timezone_id", "Africa/Brazzaville")
273 .header("Accept", "application/json")
274 .header("x-vmob-location_accuracy", "")
275 .header("Content-Type", "application/json")
276 .header("User-Agent", "Dalvik/1.6.0 (Linux; U; Android 4.4.2; Lenovo Z90-3 Build/LRX22G)")
277 .header("Host", "con-West-Europe-GMA.vmobapps.com")
278 .header("Connection", "Keep-Alive")
279 .header("Accept-Encoding", "gzip")
280 .header("Content-Length", x.length() + "")
281 .requestBody(x).ignoreContentType(true).post().body();
282
283
284 jsonnn = j.text();
285 parser = new JsonParser();
286 element = (JsonObject) parser.parse(jsonnn);
287
288 responseWrapper = element.get("redemptionText");
289
290
291 BufferedImage a = generateQR(responseWrapper.toString().replace("\"", ""));
292 ByteArrayOutputStream os = new ByteArrayOutputStream();
293 ImageIO.write(a, "gif", os);
294 InputStream is = new ByteArrayInputStream(os.toByteArray());
295 os.close();
296 return new OfferWrapper(is,element);
297
298 } catch (IOException e) {
299 e.printStackTrace();
300 }
301 return null;
302 }
303
304 // Genera l'immagine del QR sottoforma di stream
305
306 public static BufferedImage generateQR(String code){
307 int size = 250;
308 try {
309
310 Map<EncodeHintType, Object> hintMap = new EnumMap<>(EncodeHintType.class);
311 hintMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");
312
313 hintMap.put(EncodeHintType.MARGIN, 1); /* default = 4 */
314 hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
315
316 QRCodeWriter qrCodeWriter = new QRCodeWriter();
317 BitMatrix byteMatrix = qrCodeWriter.encode(code, BarcodeFormat.QR_CODE, size,
318 size, hintMap);
319 int CrunchifyWidth = byteMatrix.getWidth();
320 BufferedImage image = new BufferedImage(CrunchifyWidth, CrunchifyWidth,
321 BufferedImage.TYPE_INT_RGB);
322 image.createGraphics();
323
324 Graphics2D graphics = (Graphics2D) image.getGraphics();
325 graphics.setColor(Color.WHITE);
326 graphics.fillRect(0, 0, CrunchifyWidth, CrunchifyWidth);
327 graphics.setColor(Color.BLACK);
328
329 for (int i = 0; i < CrunchifyWidth; i++) {
330 for (int j = 0; j < CrunchifyWidth; j++) {
331 if (byteMatrix.get(i, j)) {
332 graphics.fillRect(i, j, 1, 1);
333 }
334 }
335 }
336 return image;
337 } catch (WriterException e) {
338 e.printStackTrace();
339 }
340 return null;
341 }
342
343
344
345 private static final String ALPHA_NUMERIC_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
346
347 // genera una string random avendo un limite di caratteri
348
349 public static String randomAlphaNumeric(int count) {
350
351 StringBuilder builder = new StringBuilder();
352
353 while (count-- != 0) {
354
355 int character = (int)(Math.random()*ALPHA_NUMERIC_STRING.length());
356
357 builder.append(ALPHA_NUMERIC_STRING.charAt(character));
358
359 }
360
361 return builder.toString();
362
363 }
364
365}