line.ctrl.js 4.1 KB
var Koa = require('koa');
const request = require('request');
const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
const TOKEN = 'iaoVQEV5adLHh7MbW8bZvHKoULoKZUD6B0bXD2l0srO+yXyXKRe4HBLvWQwrkKQx2fwdsz1O/qVpVh9eucUf9GxRb8w2dSaaWCXd9FTqDLP5Yu9xovneGprYlU/0VKSAVw1iphi9BfJWfjIjwWY2pAdB04t89/1O/w1cDnyilFU=';
const fs = require('fs');
const path = require('path');
const HTTPS = require('https');
const domain = "www.ossjaksimsamil.ml"
const sslport = 23023;

const bodyParser = require('body-parser');

const Profile = require("../../models/profile");
const problem_set = require("../../data/problem_set");
const compareBJ = require("../../util/compareBJ");


exports.linestart = function(req,res) {
  var eventObj = req.body.events[0];
  //var source = eventObj.source;
  //var message = eventObj.message;

  // request log
  console.log('======================', new Date() ,'======================');
  console.log('[request]', req.body);
  console.log('[request source] ', eventObj.source);
  console.log('[request message]', eventObj.message);
  if((eventObj.message.text == '문제추천')&&(username != undefined)){
      console.log("문제를 추천합니다.");
      recommendData = lineCtrl.lineRecommend(username);
      recommendBJ(eventObj.replyToken, recommendData);
  } else {
  let isExist = lineCtrl.findID(eventObj.message.text);
  if (isExist == true)
      username = eventObj.message.text;
  else{
      request.post(
          {
              url: TARGET_URL,
              headers: {
                  'Authorization': `Bearer ${TOKEN}`
              },
              json: {
                  "replyToken":replyToken,
                  "messages":[
                      {
                          "type":"text",
                          "text": "작심삼일 혹은 백준 사이트의 ID값이 올바르지 않습니다. 다시 입력해주세요."
                      }
                  ]
              }
          },(body) => {
              console.log(body)
          });
      }
  
  recommendBJ(eventObj.replyToken, eventObj.message.text);
  }
  res.sendStatus(200);
}

function recommendBJ(replyToken, message) {
  var recommendProblem = "오늘의 추천문제는 " + message.problem_title + "입니다.";
  var problemURL = "https://www.boj.kr/" + recommendData.problem_number;
  request.post(
      {
          url: TARGET_URL,
          headers: {
              'Authorization': `Bearer ${TOKEN}`
          },
          json: {
              "replyToken":replyToken,
              "messages":[
                  {
                      "type":"text",
                      "text": recommendProblem
                  },
                  {
                      "type":"text",
                      "text": problemURL
                  }
              ]
          }
      },(body) => {
          console.log(body)
      });
  

  res.sendStatus(200);
}

try {
  const option = {
    ca: fs.readFileSync('/etc/letsencrypt/live/' + domain +'/fullchain.pem'),
    key: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain +'/privkey.pem'), 'utf8').toString(),
    cert: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain +'/cert.pem'), 'utf8').toString(),
  };

  HTTPS.createServer(option, app).listen(sslport, () => {
    console.log(`[HTTPS] Server is started on port ${sslport}`);
  });
} catch (error) {
  console.log('[HTTPS] HTTPS 오류가 발생하였습니다. HTTPS 서버는 실행되지 않습니다.');
  console.log(error);
}


/*
POST api/notify/slack/recommend
{
  username: "username"
}
*/
function lineRecommend(username) {

    const profile = await Profile.findByUsername(username);
    if (!profile) {
      console.log("401");
      return;
    }
    let unsolved_data = compareBJ.compareBJ(
      profile.getBJdata(),
      problem_set.problem_set
    );
    let recommendData = compareBJ.randomItem(unsolved_data);

    if (!recommendData) {
      console.log("402");
      return;
    } 

    return recommendData;
    
};

function isExist(username) {
    const profile = await Profile.findByUsername(username);
    if (!profile) {
      return false;
    } else return true;
}