Guest User

Untitled

a guest
Nov 3rd, 2017
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. // Define our dependencies
  2. var express = require('express');
  3. var session = require('express-session');
  4. var passport = require('passport');
  5. var OAuth2Strategy = require('passport-oauth').OAuth2Strategy;
  6. var request = require('request');
  7. var handlebars = require('handlebars');
  8. var mongoose = require('mongoose');
  9. var tmi = require('tmi.js');
  10. var User = require('./models/user');
  11.  
  12. // Connect to our database
  13. mongoose.connect('<CONNECT TO DB HERE>');
  14.  
  15. // Define our constants
  16. const TWITCH_CLIENT_ID = '<YOUR CLIENT ID HERE>';
  17. const TWITCH_SECRET = '<YOUR CLIENT SECRET HERE>';
  18. const SESSION_SECRET = '<SOME SECRET HERE>';
  19. const CALLBACK_URL = '<YOUR REDIRECT URL HERE>';
  20. const TMI_API_KEY = '<YOUR TMI API KEY>';
  21.  
  22. // Initialize Express and middlewares
  23. var app = express();
  24. app.use(session({secret: SESSION_SECRET, resave: false, saveUninitialized: false}));
  25. app.use(express.static('public'));
  26. app.use(passport.initialize());
  27. app.use(passport.session());
  28.  
  29. /*
  30. Twitch Authentication
  31. */
  32. // Override passport profile function to get user profile from Twitch API
  33. OAuth2Strategy.prototype.userProfile = function(accessToken, done) {
  34. var options = {
  35. url: 'https://api.twitch.tv/kraken/user',
  36. method: 'GET',
  37. headers: {
  38. 'Client-ID': TWITCH_CLIENT_ID,
  39. 'Accept': 'application/vnd.twitchtv.v5+json',
  40. 'Authorization': 'OAuth ' + accessToken
  41. }
  42. };
  43.  
  44. request(options, function (error, response, body) {
  45. if (response && response.statusCode == 200) {
  46. // Retrieves json response used to store display_name
  47. var json = JSON.parse(body);
  48.  
  49. // Sets display_name to our user model
  50. User.display_name = json.display_name;
  51.  
  52. done(null, JSON.parse(body));
  53. } else {
  54. done(JSON.parse(body));
  55. }
  56. });
  57. }
  58.  
  59. passport.serializeUser(function(user, done) {
  60. done(null, user);
  61. });
  62.  
  63. passport.deserializeUser(function(user, done) {
  64. done(null, user);
  65. });
  66.  
  67. passport.use('twitch', new OAuth2Strategy({
  68. authorizationURL: 'https://api.twitch.tv/kraken/oauth2/authorize',
  69. tokenURL: 'https://api.twitch.tv/kraken/oauth2/token',
  70. clientID: TWITCH_CLIENT_ID,
  71. clientSecret: TWITCH_SECRET,
  72. callbackURL: CALLBACK_URL,
  73. state: true
  74. },
  75. function(accessToken, refreshToken, profile, done) {
  76. profile.accessToken = accessToken;
  77. profile.refreshToken = refreshToken;
  78.  
  79. // Create user with values to save to database
  80. var user = new User({
  81. display_name: User.display_name,
  82. access_token: accessToken,
  83. refresh_token: refreshToken
  84. });
  85.  
  86. // Securely store user profile in your DB
  87. user.save(function(err) {
  88. if (err) {
  89. console.log(err);
  90. }
  91. else {
  92. console.log('User successfully saved to DB!');
  93. }
  94. });
  95.  
  96. done(null, profile);
  97. }
  98. ));
  99.  
  100. /*
  101. Routes
  102. */
  103. // Set route to start OAuth link, this is where you define scopes to request
  104. app.get('/auth/twitch', passport.authenticate('twitch', { scope: 'user_read' }));
  105.  
  106. // Set route for OAuth redirect
  107. app.get('/auth/twitch/callback', passport.authenticate('twitch', { successRedirect: '/', failureRedirect: '/' }));
  108.  
  109. // If user has an authenticated session, then connect chat bot, otherwise display link to authenticate
  110. app.get('/', function (req, res) {
  111. if(req.session && req.session.passport && req.session.passport.user) {
  112. /*
  113. Twitch chat bot using tmi.js
  114. */
  115. // Create options for our tmi.js client
  116. var options = {
  117. options: {
  118. debug: true
  119. },
  120. connection: {
  121. cluster: "aws",
  122. recconect: true
  123. },
  124. identity: {
  125. username: "PEMchatbot",
  126. password: TMI_API_KEY
  127. },
  128. channels: [User.display_name]
  129. };
  130. // Create our tmi client
  131. var tmiClient = new tmi.client(options);
  132. // Connect our tmi client to the IRC we provided via options (aka twitch chat)
  133. tmiClient.connect();
  134.  
  135. res.send('<html><head><title>Authenticated</title></head><body>Chatbot is connected! You may close this window.</body></html>');
  136. } else {
  137. res.send('<html><head><title>Twitch Auth Sample</title></head><a href="/auth/twitch"><img src="http://ttv-api.s3.amazonaws.com/assets/connect_dark.png"></a></html>');
  138. }
  139. });
  140.  
  141. app.listen(3000, function () {
  142. console.log('Project PEMchatbot listening on port 3000!')
  143. });
Add Comment
Please, Sign In to add comment