Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2018
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.78 KB | None | 0 0
  1. package de.fiftx.discordbot.twitch;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.security.InvalidKeyException;
  6. import java.security.NoSuchAlgorithmException;
  7. import java.util.Formatter;
  8. import java.util.HashSet;
  9. import java.util.Set;
  10.  
  11. import javax.crypto.Mac;
  12. import javax.crypto.spec.SecretKeySpec;
  13. import javax.servlet.ServletException;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletResponse;
  16.  
  17. import org.eclipse.jetty.server.Request;
  18. import org.eclipse.jetty.server.Server;
  19. import org.eclipse.jetty.server.handler.AbstractHandler;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22.  
  23. import com.google.gson.JsonArray;
  24. import com.google.gson.JsonObject;
  25. import com.google.gson.JsonParser;
  26.  
  27. public class TwitchServerHandle {
  28.  
  29.     private static final Logger log = LoggerFactory.getLogger(TwitchServerHandle.class);
  30.    
  31.     private Server server;
  32.     private TwitchHandle handle;
  33.     private String secret;
  34.     private Set<Integer> ids;
  35.  
  36.     public TwitchServerHandle(int port, TwitchHandle handle, String secret) {
  37.         this.secret = secret;
  38.         this.handle = handle;
  39.         this.ids = new HashSet<>();
  40.        
  41.         server = new Server(port);
  42.         server.setHandler(new RequestHandler());
  43.        
  44.         try {
  45.             server.start();
  46.            
  47.             log.info("Webhookserver started on port {} using secret {}", port, secret);
  48.         } catch (Exception e) {
  49.             log.error(e.getMessage(), e);
  50.         }
  51.        
  52.         Runtime.getRuntime().addShutdownHook(new Thread(() ->  {
  53.             try {
  54.                 server.stop();
  55.             } catch (Exception e) {
  56.                 log.error(e.getMessage(), e);
  57.             }
  58.            
  59.             handle.unsubscribeAll();
  60.         }));
  61.     }
  62.    
  63.    
  64.     private String createSignature(String secret, String payload) throws InvalidKeyException, NoSuchAlgorithmException {
  65.         Mac mac = Mac.getInstance("HmacSHA256");
  66.         SecretKeySpec signingKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
  67.        
  68.         mac.init(signingKey);
  69.         byte[] raw = mac.doFinal(payload.getBytes());
  70.        
  71.         StringBuilder sb = new StringBuilder(raw.length * 2);  
  72.  
  73.         Formatter formatter = new Formatter(sb);  
  74.         for (byte b : raw) {  
  75.             formatter.format("%02x", b);
  76.         }
  77.        
  78.         formatter.close();
  79.        
  80.         return sb.toString();
  81.     }
  82.  
  83.    
  84.     private class RequestHandler extends AbstractHandler {
  85.  
  86.         @Override
  87.         public void handle(String target, Request request, HttpServletRequest servRequest, HttpServletResponse response)
  88.                 throws IOException, ServletException {
  89.             log.info("Received connection - handling now");
  90.                        
  91.             if(request.getMethod().toUpperCase().equals("GET")) {
  92.                 String challenge = request.getParameter("hub.challenge");
  93.                 if(challenge != null) {
  94.                     response.setContentType("text/plain");
  95.  
  96.                     response.getWriter().print(challenge);
  97.                     response.getWriter().flush();
  98.                                        
  99.                     response.setStatus(HttpServletResponse.SC_OK);
  100.                    
  101.                     request.setHandled(true);
  102.                    
  103.                     response.flushBuffer();
  104.                                        
  105.                     log.info("Confirmed challenge key {}", challenge);                 
  106.                 }
  107.             }
  108.            
  109.             if(request.getMethod().toUpperCase().equals("POST")) {
  110.                 String line = null;
  111.                 String content = "";
  112.                
  113.                 BufferedReader reader = request.getReader();
  114.                
  115.                 while((line = reader.readLine()) != null) content += line;
  116.                
  117.                 try {
  118.                     String hash = createSignature(secret, content);
  119.                     if(hash.equals(request.getHeader("X-Hub-Signature"))) {
  120.                         JsonObject object = new JsonParser().parse(content).getAsJsonObject();
  121.                         JsonArray array = object.get("data").getAsJsonArray();
  122.                         if(array.size() > 0) {
  123.                             JsonObject data = array.get(0).getAsJsonObject();
  124.                            
  125.                             TwitchStream stream = new TwitchStream(data.get("id").getAsInt(),
  126.                                     data.get("user_id").getAsInt(),
  127.                                     data.get("game_id").getAsInt(),
  128.                                     data.get("type").getAsString(),
  129.                                     data.get("title").getAsString(),
  130.                                     data.get("viewer_count").getAsInt(),
  131.                                     data.get("started_at").getAsString(),
  132.                                     data.get("language").getAsString(),
  133.                                     data.get("thumbnail_url").getAsString());
  134.                                
  135.                             log.info("Received online stream {} by {} / hash {}", stream.getId(), stream.getUser(), hash);
  136.                                
  137.                             if(!ids.contains(stream.getId())) {
  138.                                 handle.send(stream);
  139.                                 log.info("Send online stream {}", stream.getId());
  140.                             }
  141.                                
  142.                             ids.add(stream.getId());
  143.                                
  144.                         }
  145.                        
  146.                         response.setStatus(HttpServletResponse.SC_OK);
  147.                     } else {
  148.                         log.info("Hash not correct, got {} against {}", hash, request.getHeader("X-Hub-Signature"));
  149.                     }
  150.                 } catch (InvalidKeyException | NoSuchAlgorithmException e) {
  151.                     log.error(e.getMessage(), e);
  152.                 }
  153.             }
  154.            
  155.             request.setHandled(true);
  156.         }
  157.     }
  158.  
  159.     public void close() {
  160.         try {
  161.             server.stop();
  162.         } catch (Exception e) {
  163.             log.error(e.getMessage(), e);
  164.         }
  165.     }
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement