gas로 약간의 discord bot 만들기
그 모드를 아무래도 나는 많이 하고 있는 것 같고,
하루가 얼마나 되는지, 친구와 얼마나 차이가 있는지
알고 싶어졌습니다.
그래서 이번에는 게임의 매칭 대기 시간을 이용하여 discord의 bot를 작성해 보았습니다.
gas로 간단하게 스케줄 실행이 가능하다고 들었으므로, gas로 했습니다.
메커니즘
htps : // r6 b. 코m/
↑는 그 게임의 통계를 보는 사이트입니다(비공식)
API 를 이용하여 통계를 얻고 있습니다.
같은 흐름을 스케줄 실행하고 있습니다.
실행 결과
자신의 유저명 이외는 일단 숨기고 있습니다.
사용자 이름과 총 킬 수, 어제와의 차이를 표시합니다.
스프레드시트
자신의 유저명 이외는 일단 숨기고 있습니다.
A 열의 사용자 이름
B열에 킬수(초회 등록시는 0)
설정합니다.
소스 코드
function main() {
// チェックするユーザー, キル数を取得
var sheet = SpreadsheetApp.getActiveSheet();
var users = sheet.getRange('A:A').getValues();
var count = users.filter(String).length; // ユーザー数
var beforeKills = sheet.getRange('B:B').getValues();
var messages = [];
for (var i = 0; i < count; i++) {
var id = getPlayerId(users[i]);
if (!id) {
messages.push('このユーザー名は存在しません。');
continue;
}
var currentKills = getThuntKills(id);
// 差分計算
var diff = Number(currentKills) - Number(beforeKills[i]);
diff = Math.floor(diff);
messages.push('総キル数: `' + currentKills + '`\n 前回との差分: `' + diff + '`');
// スプレッドシートの更新
sheet.getRange('B' + (i + 1)).setValue(currentKills);
}
// キル数でソート
sort();
var text = createText(count, users, messages);
postDiscord(text);
}
/**
* プレイヤーIDを取得する
*
* @param {String} username - ユーザー名
*
* @returns String プレイヤーID
*/
function getPlayerId(username) {
var url = 'https://r6.apitab.com/search/uplay/' + username;
var response = UrlFetchApp.fetch(url);
var content = JSON.parse(response.getContentText('UTF-8'));
// 存在しないユーザーを確認
if (content['foundmatch'] === false) { return false; }
var p_id = Object.keys(content['players'])[0];
return p_id;
}
/**
* テロハントのキル数を取得する
*
* @param {String} id - プレイヤーID
*
* @returns Number キル数
*/
function getThuntKills(id) {
var url = 'https://r6.apitab.com/player/' + id;
var response = UrlFetchApp.fetch(url);
var content = JSON.parse(response.getContentText('UTF-8'));
var kills = content['stats']['generalpve_kills']
return kills;
}
/**
* 投稿するメッセージを作成する
*
* @param {Int} count - ユーザー数
* @param {Array} users - ユーザー
* @param {Array} messages - メッセージ
*
* @returns Object - 投稿するメッセージ
*/
function createText(count, users, messages) {
var results = [];
for (i = 0; i < count; i++) {
results[i] = {
'name': users[i][0],
'value': messages[i],
'inline': true
};
}
var text = {
"embeds": [
{
"color": 15105570, // orange
"fields": results
}
]
};
return text;
}
/**
* Discordに投稿する
*
* @param {Object} text - 投稿するメッセージ
*/
function postDiscord(text) {
var url = 'https://discordapp.com/api/webhooks/000000000000/xxxxxxxxxxxxxxxxxx';
var params = {
'method': 'POST',
'headers': { 'Content-type': 'application/json' },
'payload': JSON.stringify(text)
};
UrlFetchApp.fetch(url, params);
}
/**
* キル数でソートをする
*/
function sort() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var range = sheet.getRange("A:B");
range.sort([{ column: 2, ascending: false }]);
}
실행 트리거
선택만 합니다만 아침 9시 정도에 투고되도록 했습니다.
감상
자신의 유저명 이외는 일단 숨기고 있습니다.
A 열의 사용자 이름
B열에 킬수(초회 등록시는 0)
설정합니다.
소스 코드
function main() {
// チェックするユーザー, キル数を取得
var sheet = SpreadsheetApp.getActiveSheet();
var users = sheet.getRange('A:A').getValues();
var count = users.filter(String).length; // ユーザー数
var beforeKills = sheet.getRange('B:B').getValues();
var messages = [];
for (var i = 0; i < count; i++) {
var id = getPlayerId(users[i]);
if (!id) {
messages.push('このユーザー名は存在しません。');
continue;
}
var currentKills = getThuntKills(id);
// 差分計算
var diff = Number(currentKills) - Number(beforeKills[i]);
diff = Math.floor(diff);
messages.push('総キル数: `' + currentKills + '`\n 前回との差分: `' + diff + '`');
// スプレッドシートの更新
sheet.getRange('B' + (i + 1)).setValue(currentKills);
}
// キル数でソート
sort();
var text = createText(count, users, messages);
postDiscord(text);
}
/**
* プレイヤーIDを取得する
*
* @param {String} username - ユーザー名
*
* @returns String プレイヤーID
*/
function getPlayerId(username) {
var url = 'https://r6.apitab.com/search/uplay/' + username;
var response = UrlFetchApp.fetch(url);
var content = JSON.parse(response.getContentText('UTF-8'));
// 存在しないユーザーを確認
if (content['foundmatch'] === false) { return false; }
var p_id = Object.keys(content['players'])[0];
return p_id;
}
/**
* テロハントのキル数を取得する
*
* @param {String} id - プレイヤーID
*
* @returns Number キル数
*/
function getThuntKills(id) {
var url = 'https://r6.apitab.com/player/' + id;
var response = UrlFetchApp.fetch(url);
var content = JSON.parse(response.getContentText('UTF-8'));
var kills = content['stats']['generalpve_kills']
return kills;
}
/**
* 投稿するメッセージを作成する
*
* @param {Int} count - ユーザー数
* @param {Array} users - ユーザー
* @param {Array} messages - メッセージ
*
* @returns Object - 投稿するメッセージ
*/
function createText(count, users, messages) {
var results = [];
for (i = 0; i < count; i++) {
results[i] = {
'name': users[i][0],
'value': messages[i],
'inline': true
};
}
var text = {
"embeds": [
{
"color": 15105570, // orange
"fields": results
}
]
};
return text;
}
/**
* Discordに投稿する
*
* @param {Object} text - 投稿するメッセージ
*/
function postDiscord(text) {
var url = 'https://discordapp.com/api/webhooks/000000000000/xxxxxxxxxxxxxxxxxx';
var params = {
'method': 'POST',
'headers': { 'Content-type': 'application/json' },
'payload': JSON.stringify(text)
};
UrlFetchApp.fetch(url, params);
}
/**
* キル数でソートをする
*/
function sort() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var range = sheet.getRange("A:B");
range.sort([{ column: 2, ascending: false }]);
}
실행 트리거
선택만 합니다만 아침 9시 정도에 투고되도록 했습니다.
감상
function main() {
// チェックするユーザー, キル数を取得
var sheet = SpreadsheetApp.getActiveSheet();
var users = sheet.getRange('A:A').getValues();
var count = users.filter(String).length; // ユーザー数
var beforeKills = sheet.getRange('B:B').getValues();
var messages = [];
for (var i = 0; i < count; i++) {
var id = getPlayerId(users[i]);
if (!id) {
messages.push('このユーザー名は存在しません。');
continue;
}
var currentKills = getThuntKills(id);
// 差分計算
var diff = Number(currentKills) - Number(beforeKills[i]);
diff = Math.floor(diff);
messages.push('総キル数: `' + currentKills + '`\n 前回との差分: `' + diff + '`');
// スプレッドシートの更新
sheet.getRange('B' + (i + 1)).setValue(currentKills);
}
// キル数でソート
sort();
var text = createText(count, users, messages);
postDiscord(text);
}
/**
* プレイヤーIDを取得する
*
* @param {String} username - ユーザー名
*
* @returns String プレイヤーID
*/
function getPlayerId(username) {
var url = 'https://r6.apitab.com/search/uplay/' + username;
var response = UrlFetchApp.fetch(url);
var content = JSON.parse(response.getContentText('UTF-8'));
// 存在しないユーザーを確認
if (content['foundmatch'] === false) { return false; }
var p_id = Object.keys(content['players'])[0];
return p_id;
}
/**
* テロハントのキル数を取得する
*
* @param {String} id - プレイヤーID
*
* @returns Number キル数
*/
function getThuntKills(id) {
var url = 'https://r6.apitab.com/player/' + id;
var response = UrlFetchApp.fetch(url);
var content = JSON.parse(response.getContentText('UTF-8'));
var kills = content['stats']['generalpve_kills']
return kills;
}
/**
* 投稿するメッセージを作成する
*
* @param {Int} count - ユーザー数
* @param {Array} users - ユーザー
* @param {Array} messages - メッセージ
*
* @returns Object - 投稿するメッセージ
*/
function createText(count, users, messages) {
var results = [];
for (i = 0; i < count; i++) {
results[i] = {
'name': users[i][0],
'value': messages[i],
'inline': true
};
}
var text = {
"embeds": [
{
"color": 15105570, // orange
"fields": results
}
]
};
return text;
}
/**
* Discordに投稿する
*
* @param {Object} text - 投稿するメッセージ
*/
function postDiscord(text) {
var url = 'https://discordapp.com/api/webhooks/000000000000/xxxxxxxxxxxxxxxxxx';
var params = {
'method': 'POST',
'headers': { 'Content-type': 'application/json' },
'payload': JSON.stringify(text)
};
UrlFetchApp.fetch(url, params);
}
/**
* キル数でソートをする
*/
function sort() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var range = sheet.getRange("A:B");
range.sort([{ column: 2, ascending: false }]);
}
선택만 합니다만 아침 9시 정도에 투고되도록 했습니다.
감상
미래의 자신에게
해주세요.
링크
rainbow six siege
사용한 API
discord webhook document
Reference
이 문제에 관하여(gas로 약간의 discord bot 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/bakuwarorin/items/164f29c446f8723d787b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(gas로 약간의 discord bot 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bakuwarorin/items/164f29c446f8723d787b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)