initial commit
This commit is contained in:
commit
1ab6746d9a
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules
|
17
README.md
Normal file
17
README.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Chess Bot for Mastodon
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
npm i or yarn
|
||||||
|
|
||||||
|
## Config
|
||||||
|
|
||||||
|
edit config.js
|
||||||
|
|
||||||
|
## Run
|
||||||
|
|
||||||
|
npm start
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT
|
5
config.js
Normal file
5
config.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
module.exports = {
|
||||||
|
nick: 'chessbot',
|
||||||
|
accessToken: '',
|
||||||
|
url: 'mastodon.manalejandro.com'
|
||||||
|
}
|
87
index.js
Normal file
87
index.js
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
const { createRestAPIClient, createStreamingAPIClient } = require('masto'),
|
||||||
|
jsChessEngine = require('js-chess-engine'),
|
||||||
|
ChessImageGenerator = require('chess-image-generator'),
|
||||||
|
config = require('./config.js'),
|
||||||
|
fs = require('fs');
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
const nick = config.nick,
|
||||||
|
rest = createRestAPIClient({
|
||||||
|
url: `https://${config.url}`,
|
||||||
|
accessToken: config.accessToken,
|
||||||
|
requestInit: {
|
||||||
|
headers: [
|
||||||
|
['User-Agent', nick]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
ws = createStreamingAPIClient({
|
||||||
|
streamingApiUrl: `wss://${config.url}`,
|
||||||
|
accessToken: config.accessToken,
|
||||||
|
retry: true
|
||||||
|
}),
|
||||||
|
sendMessage = async (game, aimove, status, msg) => {
|
||||||
|
const imageGenerator = new ChessImageGenerator({
|
||||||
|
size: 720,
|
||||||
|
light: 'rgb(200, 200, 200)',
|
||||||
|
dark: '#333333',
|
||||||
|
style: 'merida'
|
||||||
|
})
|
||||||
|
await imageGenerator.loadFEN(game.exportFEN())
|
||||||
|
const buf = await imageGenerator.generateBuffer(),
|
||||||
|
statusImage = await rest.v2.media.create({
|
||||||
|
file: new Blob([buf], { type: 'image/png' }),
|
||||||
|
skipPolling: true,
|
||||||
|
description: aimove ? `Chessbot move ${Object.keys(aimove)[0]} to ${Object.values(aimove)[0]}` : 'Chessbot'
|
||||||
|
})
|
||||||
|
let canmove
|
||||||
|
if (aimove) {
|
||||||
|
moves = game.moves()
|
||||||
|
canmove = Object.keys(moves).map(key => `move ${key} to ${moves[key].join(', ')}`)
|
||||||
|
}
|
||||||
|
await rest.v1.statuses.create({
|
||||||
|
status: `${msg}${aimove ? '\nMovimientos posibles:\n' + canmove.join('\n') : ''}`,
|
||||||
|
mediaIds: [statusImage.id],
|
||||||
|
visibility: 'public',
|
||||||
|
inReplyToId: status?.id,
|
||||||
|
language: status?.language
|
||||||
|
})
|
||||||
|
}
|
||||||
|
let game
|
||||||
|
if (fs.existsSync('game.txt')) {
|
||||||
|
game = new jsChessEngine.Game(JSON.parse(fs.readFileSync('game.txt').toString()))
|
||||||
|
sendMessage(game, null, null, `Partida en juego. Su turno.`)
|
||||||
|
}
|
||||||
|
for await (const notification of ws.user.notification.subscribe()) {
|
||||||
|
if (notification.payload['type'] === 'mention' && notification.payload['status']) {
|
||||||
|
const status = notification.payload['status']
|
||||||
|
if (status && status.visibility !== 'direct' && status.account.acct !== nick && status.content.trim() !== '') {
|
||||||
|
const content = ('' + status.content).replace(/<[^>]*>?/gm, '').split(' ').filter(token => !token.startsWith('@'))
|
||||||
|
if (!game || game?.status?.isFinished) {
|
||||||
|
game = new jsChessEngine.Game()
|
||||||
|
sendMessage(game, status, 'Una partidita de ajedrez profesor Falken?')
|
||||||
|
}
|
||||||
|
else if (content.length > 1
|
||||||
|
&& content[0] === 'move'
|
||||||
|
&& content[1].match(/^[A-H]{1}[1-8]{1}$/)
|
||||||
|
&& content[2].match(/^[A-H]{1}[1-8]{1}$/)) {
|
||||||
|
game.move(content[1], content[2])
|
||||||
|
const d = Date.now(),
|
||||||
|
levelIA = Math.floor(Math.random() * 5),
|
||||||
|
aimove = game.aiMove(levelIA),
|
||||||
|
time = Date.now() - d
|
||||||
|
if (game?.status && game?.status?.checkMate) {
|
||||||
|
await sendMessage(game, aimove, status, 'Jaque.')
|
||||||
|
} else {
|
||||||
|
await sendMessage(game, aimove, status, `Su turno, movimiento IA ${Object.keys(aimove)[0]} a ${Object.values(aimove)[0]} nivel ${levelIA + 1} en ${time / 1000}s`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (game?.status?.isFinished) {
|
||||||
|
fs.rmSync('game.txt')
|
||||||
|
} else {
|
||||||
|
fs.writeFileSync('game.txt', JSON.stringify(game.exportJson()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})()
|
27
package.json
Normal file
27
package.json
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "chessbot-mastodon",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Chess Bot for mastodon",
|
||||||
|
"main": "index.js",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"start": "node index.js"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.manalejandro.com/ale/chessbot-mastodon"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"bot",
|
||||||
|
"activity",
|
||||||
|
"mastodon",
|
||||||
|
"chess"
|
||||||
|
],
|
||||||
|
"author": "ale",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"chess-image-generator": "^1.0.9",
|
||||||
|
"js-chess-engine": "^1.0.2",
|
||||||
|
"masto": "^6.8.0"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user