Skip to content

Commit

Permalink
hi
Browse files Browse the repository at this point in the history
  • Loading branch information
YOUNG EUN committed Nov 6, 2017
1 parent 5fb36ef commit 4691bb9
Show file tree
Hide file tree
Showing 40 changed files with 1,120 additions and 613 deletions.
2 changes: 2 additions & 0 deletions .env_sample
@@ -0,0 +1,2 @@
BOT_API_KEY=
BOT_NAME=
7 changes: 5 additions & 2 deletions .eslintrc
@@ -1,7 +1,8 @@
{
"extends": ["airbnb", "plugin:react/recommended"],
"env": {
"node": true
"node": true,
"browser": true
},
"rules": {
"new-cap": [2, { "capIsNewExceptions": ["List", "Map", "Set", "Router"] }],
Expand All @@ -28,7 +29,9 @@
"no-unneeded-ternary": 0,
"no-plusplus": 0,
"prefer-template": 0,
"prefer-arrow-callback": 0
"prefer-arrow-callback": 0,
"class-methods-use-this": 0,
"react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
},
"plugins": [
"import", "react"
Expand Down
4 changes: 2 additions & 2 deletions .gitignore
Expand Up @@ -60,8 +60,8 @@ typings/
.env

.idea
pm2.json
nodemon.json
.DS_Store
pm2.json
data/dumbledore.db
package-lock.json
bundle.js
6 changes: 3 additions & 3 deletions .travis.yml
Expand Up @@ -6,8 +6,8 @@ cache:
directories:
- node_modules
before_script:
- npm run travis
- npm run travis
env:
global:
- secure: xGKT41g2ntScqxUP1PzVlIx/s8MIVwyDLK7D93exHSc3XuQ2/hEJB1WqoToDeW/40NSAjl4NCLQ918wLLCWnRtxkA8bp8JgqBDPYlbWLCHfyAqXhF5RpS8Yq//hAYTseiX/6q/ZsU9v+z7lofm2xm2dXgI8AlOXbSYH0XXt+WayZVqaueXnGizNQ1q1NgXEvCPYQVVf9FgkM/wfBUptbCp8qbKdrYA7nrz+69QZIECAO3asvMcVFRRuDV0BLTXELT+J9nCFMa/q1ygl6Qpy6UMQvDWnljXtyhGRnqyISX1okACEfStl5ic0oLc6hYJgbdkB4CXSdJG9C/j7of8dDZTRN2QhYqjygs+7kCNyYGh4w2/F1trxvnuoNCp4UJo33FOTiYE4Mq8HSB4F8ecB/fxXvG6PK1Ir7q9h+ECm55nohRMadTGVMPLekTvk5l3zpPjfCuAwei4rps2ayoOvF452zkqsRvc4cGPBVwnUGnohTYJjtiMt+9T9HWyU34QD8C8SHyp+ty+544f0TH7f3a8xBULGdcUPWuIYazUwf0RsomOLAzZAvqj9K+ok5/+P2johQAJRmitn+XtbhSLjcLHvqzcUisOkwdT5SnlsFJ3I1Dl2WS6SCko2Omaf2E3oZI+SIRkswSKCVGUum8lgQavVLo0DVTvA9CvlaXqXNxGU=
- secure: n0tnMsGZZx+xVokW/jC3owFp+hP3XafqfLbgY/5AkFl4+ixKEz/9r8t1ykHjC4SkArNbaQHD4aS4udqQ8zguNUpX7LsoUOB85tKO6dnxXSFZTZ8IBAMs2YUfZaL2XHgnlZx4Dj7B7znnYNuqZECU/u13991HFeMM0XYd0r0GDDkRiy+WhOwt113xof8brqjj3XRCqn1eyOlHqPCcux+P8vGdietdPqLMolrksb4udF+gBHKu/bJUzwA0ALw9lIiUAQyyVkRVQp0rdHBU6WD1rX4Z3Jz5S4RECCQL1OPMpP6dbbvLZ3SX/iC2+/+OVDvfkfdyQ9EzjmopIPJLM8nhhvhl243rfJeUFyWTkaW3TMcFWu+QkYHvqmoRSIlABhhiwXwdeSqy37RzDX6LwVEiTqVN7yopthlaiTRVsSPT4HWGE10KUb6d3IKVE0PWdICPSDNvYrmf4Eip3Kp1/QhNhvqw9/JGEHUIoLAoUqwD+d3B0z8NFa/9K/jBrfOf7R4LSl5b/WZtWTDOTNtxJpvB81HHK7euyrnmQNTwMTXrZpr9k7jsYD703ClCwHh7HxjtjOZGD06Un2No7txlwMsUbmiMb6+9DDJCTP7sWbqMj3J/TWRib+dqbyyBeVsneOmCOaMJnYj1K4qmNCwKn+vhY1jacAf2ajlh/kxo1KuPvwE=
- BOT_API_KEY=eG94Yi0yNTQwNTc5Mjg5ODAtMDE0TU4zY2FrQmlhS3NXSnJJNEw5WGEw
- BOT_NAME=travis
10 changes: 5 additions & 5 deletions README.md
Expand Up @@ -43,20 +43,20 @@ Dumbledore is configurable through environment variables. There are several vari

```bash
$ npm install -g nodemon
$ cp ./nodemon_sample.json ./nodemon.json
// You need to change `nodemon.json`
$ cp ./.env_sample ./.env
// You need to change `.env`
$ npm run dev
```

## Test
* We use [jasmine](https://jasmine.github.io/):

```bash
$ BOT_API_KEY={key} BOT_NAME={name} npm test
$ cp ./.env_sample ./.env
// You need to change `.env`
$ npm test
```

* If you are a Windows user, use [cross-env](https://www.npmjs.com/package/cross-env).

## Production
* We recommend the pm2:

Expand Down
92 changes: 63 additions & 29 deletions bin/bot.js
@@ -1,10 +1,10 @@
<<<<<<< HEAD
'use strict';

var Dumbledore = require('../lib/dumbledore');//Dumbledore변수에 dumbledore.js파일을 요청한다
=======
const Dumbledore = require('../lib/dumbledore');
>>>>>>> young/master
const ParseInstance = require('../parse-server/parse');
const WebInstance = require('../server/app');
const Parse = require('parse/node');
const { atob } = require('../lib/helper/common');
const { DB } = require('../lib/word');


/**
* Environment variables used to configure the bot:
Expand All @@ -16,31 +16,65 @@ const Dumbledore = require('../lib/dumbledore');
* BOT_GITHUB_CHANNEL_ID: If your team uses a github slack channel for alerts, The Gitub Channel Id goes here.
*/

<<<<<<< HEAD
var token ='xoxb-248266143441-zgzDCId1tMbBG7GKaToXsUi2';// process.env.BOT_API_KEY;//token 변수에 api key값 저장
var dbPath ;//= process.env.BOT_DB_PATH;//dbPath변수에 bot dbpath 저장
var name = 'bot1';//name 변수에 bot이름 저장
var githubChannel = '#song97';//process.env.BOT_GITHUB_CHANNEL_ID;//githubChannel변수에 channel id 저장

var dumbledore = new Dumbledore({//dumbledore변수에 Dumbledore객체 참조
token: token,
dbPath: dbPath,
name: name,
githubChannel: githubChannel
const parseServer = new ParseInstance({
databaseURI: process.env.DATABASE_URI,
cloud: process.env.CLOUD_CODE_MAIN,
appId: process.env.APP_ID,
masterKey: process.env.MASTER_KEY,
serverURL: process.env.SERVER_URL,
port: process.env.PARSE_PORT,
mountPath: process.env.MOUNT_PATH,
user: process.env.ADMIN_NAME,
pass: process.env.ADMIN_PASS,
});

// parse js sdk
Parse.initialize(process.env.APP_ID || 'myAppId', null, process.env.MASTER_KEY || 'masterKey');
Parse.serverURL = process.env.SERVER_URL || 'http://localhost:1337/parse';

console.log("Start +Dumbledore bot+ on your slack channel.");
dumbledore.run();//dumbledore run 호출
async function startBot() {
try {
await parseServer.create();

=======
const dumbledore = new Dumbledore({
token: process.env.BOT_API_KEY,
dbPath: process.env.BOT_DB_PATH,
name: process.env.BOT_NAME,
githubChannel: process.env.BOT_GITHUB_CHANNEL_ID
});
// web server
const webServer = new WebInstance({
setting: process.env.WEB_PORT
});
webServer.create();

if (process.env.NODE_ENV === 'development') {
const query = new Parse.Query(DB.BOT.CALL);
const botCount = await query.count();

if (!botCount) {
const name = process.env.BOT_NAME;

// base64 encoded token
let token = process.env.BOT_API_KEY;
if (token.length > 42) token = atob(token);

const obj = new Parse.Object(DB.BOT.CALL);
await obj.save({
[DB.BOT.BOT_NAME]: name,
[DB.BOT.BOT_API_KEY]: token
});
}
}

// dumbledore bot
const query = new Parse.Query(DB.BOT.CALL);
await query.each((o) => {
const dumbledore = new Dumbledore({
token: o.get(DB.BOT.BOT_API_KEY),
name: o.get(DB.BOT.BOT_NAME)
});

console.log('Start +Dumbledore bot+ on your slack channel.');
dumbledore.run();
>>>>>>> young/master
dumbledore.run().then(() => {
console.log('Start *Dumbledore bot* on your slack channel.');
}, console.error);
});
} catch (error) {
return console.log(error);
}
}
startBot();
58 changes: 21 additions & 37 deletions lib/controller/awardPoints.js
@@ -1,42 +1,26 @@
const getPointsFromDatabase = require('../helper/getPointsFromDatabase');
const botCommand = require('../helper/botCommand');
const Parse = require('parse/node');
const { DB } = require('../word');

function awardPoints(originalMessage) {
let points = originalMessage.text.split(' ')[0].replace(/[^\d.]/g, '');
if (points > 100) { points = 100; }

if (originalMessage.text.toLowerCase().indexOf('gryffindor') > -1) {
this.db.run('UPDATE houses SET points = points + ? WHERE house = "gryffindor"', points);
this.db.run('UPDATE students SET points_given = (points_given + ?) WHERE user_id = ?', points, originalMessage.user);
getPointsFromDatabase.call(this, originalMessage, 'gryffindor', botCommand.awardPointsCallback);
} else if (originalMessage.text.toLowerCase().indexOf('hufflepuff') > -1) {
this.db.run('UPDATE houses SET points = points + ? WHERE house = "hufflepuff"', points);
this.db.run('UPDATE students SET points_given = (points_given + ?) WHERE user_id = ?', points, originalMessage.user);
getPointsFromDatabase.call(this, originalMessage, 'hufflepuff', botCommand.awardPointsCallback);
} else if (originalMessage.text.toLowerCase().indexOf('ravenclaw') > -1) {
this.db.run('UPDATE houses SET points = points + ? WHERE house = "ravenclaw"', points);
this.db.run('UPDATE students SET points_given = (points_given + ?) WHERE user_id = ?', points, originalMessage.user);
getPointsFromDatabase.call(this, originalMessage, 'ravenclaw', botCommand.awardPointsCallback);
} else if (originalMessage.text.toLowerCase().indexOf('slytherin') > -1) {
this.db.run('UPDATE houses SET points = points + ? WHERE house = "slytherin"', points);
this.db.run('UPDATE students SET points_given = (points_given + ?) WHERE user_id = ?', points, originalMessage.user);
getPointsFromDatabase.call(this, originalMessage, 'slytherin', botCommand.awardPointsCallback);
} else if (originalMessage.text.toLowerCase().indexOf('@') > -1) {
const student = originalMessage.text.substring(originalMessage.text.indexOf('@') + 1).split('>')[0];

this.db.get('SELECT user_id, username, house FROM students WHERE user_id = ?', student, (err, record) => {
if (err) {
return console.error('DATABASE ERROR:', err);
}
if (record !== undefined) {
const message = originalMessage;
message.text = points + ' ' + record.house;
this.awardPoints(message);

this.db.run('UPDATE students SET points_earned = (points_earned + ?) WHERE user_id = ?', points, student);
function awardPoints(botId, userId, point) {
if (typeof botId === 'undefined' || typeof userId === 'undefined' || typeof point === 'undefined') return;
const Student = new Parse.Object(DB.STUDENT.CALL);
const query = new Parse.Query(Student);
query.equalTo(DB.STUDENT.BOT_ID, botId).equalTo(DB.STUDENT.USER_ID, userId).find({
success(results) {
if (results.length === 0) {
Student.save({
[DB.STUDENT.BOT_ID]: botId,
[DB.STUDENT.USER_ID]: userId,
[DB.STUDENT.POINT]: point
});
}
});
}
results[0].increment(DB.STUDENT.POINT, point);
results[0].save();
},
error(error) {
console.log(error.message);
}
});
}

module.exports = awardPoints;
55 changes: 20 additions & 35 deletions lib/controller/deductPoints.js
@@ -1,41 +1,26 @@
const getPointsFromDatabase = require('../helper/getPointsFromDatabase');
const botCommand = require('../helper/botCommand');
const Parse = require('parse/node');
const { DB } = require('../word');

function deductPoints(originalMessage) {
let points = originalMessage.text.split(' ')[0].replace(/[^\d.]/g, '');
function deductPoints(botId, userId, point) {
if (typeof botId === 'undefined' || typeof userId === 'undefined' || typeof point === 'undefined') return;
const Student = new Parse.Object(DB.STUDENT.CALL);
const query = new Parse.Query(Student);
query.equalTo(DB.STUDENT.BOT_ID, botId).equalTo(DB.STUDENT.USER_ID, userId).find({
success(results) {
if (results.length === 0) {
Student.set(DB.STUDENT.BOT_ID, botId);
Student.set(DB.STUDENT.USER_ID, userId);
Student.set(DB.STUDENT.POINT, -point);

if (points > 100) { points = 100; }
if (originalMessage.text.toLowerCase().indexOf('gryffindor') > -1) {
this.db.run('UPDATE houses SET points = MAX(0, points - ?) WHERE house = "gryffindor"', points);
this.db.run('UPDATE students SET points_taken = (points_taken + ?) WHERE user_id = ?', points, originalMessage.user);
getPointsFromDatabase.call(this, originalMessage, 'gryffindor', botCommand.deductPointsCallback);
} else if (originalMessage.text.toLowerCase().indexOf('hufflepuff') > -1) {
this.db.run('UPDATE houses SET points = MAX(0, points - ?) WHERE house = "hufflepuff"', points);
getPointsFromDatabase.call(this, originalMessage, 'hufflepuff', botCommand.deductPointsCallback);
this.db.run('UPDATE students SET points_taken = (points_taken + ?) WHERE user_id = ?', points, originalMessage.user);
} else if (originalMessage.text.toLowerCase().indexOf('ravenclaw') > -1) {
this.db.run('UPDATE houses SET points = MAX(0, points - ?) WHERE house = "ravenclaw"', points);
getPointsFromDatabase.call(this, originalMessage, 'ravenclaw', botCommand.deductPointsCallback);
this.db.run('UPDATE students SET points_taken = (points_taken + ?) WHERE user_id = ?', points, originalMessage.user);
} else if (originalMessage.text.toLowerCase().indexOf('slytherin') > -1) {
this.db.run('UPDATE houses SET points = MAX(0, points - ?) WHERE house = "slytherin"', points);
getPointsFromDatabase.call(this, originalMessage, 'slytherin', botCommand.deductPointsCallback);
this.db.run('UPDATE students SET points_taken = (points_taken + ?) WHERE user_id = ?', points, originalMessage.user);
} else if (originalMessage.text.toLowerCase().indexOf('@') > -1) {
const student = originalMessage.text.substring(originalMessage.text.indexOf('@') + 1).split('>')[0];

this.db.get('SELECT user_id, username, house FROM students WHERE user_id = ?', student, (err, record) => {
if (err) {
return console.error('DATABASE ERROR:', err);
}

if (record !== undefined) {
const message = originalMessage;
message.text = points + ' ' + record.house;
this.deductPoints(message);
Student.save();
}
});
}
results[0].increment(DB.STUDENT.POINT, -point);
results[0].save();
},
error(error) {
console.log(error.message);
}
});
}

module.exports = deductPoints;
9 changes: 4 additions & 5 deletions lib/controller/helpMessage.js
@@ -1,24 +1,23 @@
const botCommand = require('../helper/botCommand');
const { INPUT } = require('../word');

async function helpMessage(originalMessage) {
const { POINTS_TO, POINTS_FROM, PROFESSOR } = INPUT;

// for points to
const pointTo = `\`Num\` ${POINTS_TO.CALL} \`house name\``;
await botCommand.announcePlainString(originalMessage, pointTo, this);
await this.slackBot.announcePlainString(originalMessage, pointTo);

// for points from
const pointFrom = `\`Num\` ${POINTS_FROM.CALL} \`house name\``;
await botCommand.announcePlainString(originalMessage, pointFrom, this);
await this.slackBot.announcePlainString(originalMessage, pointFrom);

// for professor
// todo: show details
Object.keys(PROFESSOR).forEach(async k => {
if (k !== 'CALL') {
const str = `\`${PROFESSOR.CALL}\` or \`${this.name}\` ${typeof PROFESSOR[k] === 'object' ? PROFESSOR[k].CALL : PROFESSOR[k]}`;
const str = `\`${PROFESSOR.CALL}\` or \`${this.slackBot.getName()}\` ${typeof PROFESSOR[k] === 'object' ? PROFESSOR[k].CALL : PROFESSOR[k]}`;

await botCommand.announcePlainString(originalMessage, str, this);
await this.slackBot.announcePlainString(originalMessage, str);
}
});
}
Expand Down

0 comments on commit 4691bb9

Please sign in to comment.