Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Node.js (JS+DB (на JSON) + VK_API

Ответить
Настройки темы
Разное - Node.js (JS+DB (на JSON) + VK_API

Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


В своём проекте «Чат Бот Наполеон Вк» я планирую использовать данную нубскую базу данных

Код: Выделить весь код
var fs = require('fs')
function Model (fields, dbPath) {
    this.fields = fields
    this.dbPath = dbPath
    var fs = require('fs');
    var defaultBase = {
        "items": [],
        "count": 0
    }

    if (fs.existsSync(this.dbPath)) {
            var base = JSON.parse(fs.readFileSync(this.dbPath, 'UTF-8'))
    } else {
            var base = defaultBase
    }

    this.rows = base.items
    this.count = base.count

    this.save = () => {
        var base = {items: this.rows, count: this.count}
        fs.writeFileSync(this.dbPath, JSON.stringify(base))
    }

    this.makeId = () => {
        var text = "";
        var possible = "abcdefghijklmnopqrstuvwxyz0123456789";

        for (var i = 0; i < 10; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));

        return text;
    }        

    this.insert = (o) => {
        this.count = this.count + 1

        var id = this.makeId()

        var r = {_id: id}
        for (f in this.fields) {
            r[f] = o[f]
        }

        this.rows.push(r)
        this.save()
        return r
    }

    this.findOne = (n, v, b) => {
        var res = []
        b.forEach((row)=>{
            if (this.fields[n] == 'number') {
                if (row[n] == v) {
                    res.push(row)
                }  
            } else if (this.fields[n] == 'string') {
                if (row[n].toLowerCase() == v.toLowerCase()) {
                    res.push(row)
                }  
            }
        })

        return res
    }         

    this.get = (id) =>{
        var r = false
        this.rows.forEach((item)=>{
            if (!r && item._id == id) 
                r = item
        })
        
        return r
    }

    this.find = (o) =>{
        var b = this.rows

        for (i in o) {
            r = this.findOne(i, o[i], b)
        }
        if (r.length > 0) {
                return r
        } else 
            return false
    }

    this.delete = (o) =>{
        var r = this.find(o)
        r.forEach((item)=>{
            var index = this.rows.indexOf(item);
            if (index > -1) {
                this.rows.splice(index, 1);
            }
        })

        this.save()
    }
}

function Db (models, p = false) {
    this.p = {
        dbPath: __dirname,
        modelPath: __dirname
    }

    if (p) {
        for(i in p) {
            this.p[i] = p[i]
        }
    }
    this.models = []
    models.forEach((m)=>{
        var name = m.name
        this.models[name] = new Model(m, this.p)
        this[name] = this.models[name]
    }) 
}

module.exports = Model
Бот работает на модуле VK Promise

Бот состоит из

1) Config.js

Код: Выделить весь код
module.exports = 
{
    access_token: 'ТУТ МОЙ ТОКЕН ОТ ВК'
}
2) Intro.js (Приветствие когда запускаешь в консоли

Код: Выделить весь код
var fs = require('fs')
var interval = 100
var intro = fs.readFileSync('./intro.txt', 'UTF-8')
var strings = intro.split('\n')

writeString(strings)

function writeString(strings) {
    if (strings.length > 0) {
        var string = strings.shift()
        console.log(string);
        if (string.trim() != '') setTimeout(()=>{writeString(strings)}, interval)   
        else writeString(strings)
    }
}
Само интро записано в тхт файл и берется от туда

3) napoleon.js собственно сам бот, один момент, ответы на команду /все команды тоже берутся из тхт файла

Код: Выделить весь код
//Node.js Bot for VK "Napoleon" v1.0

const Db = require('noob-db')

var infa = new Db ({
    name: 'string',
    text: 'string'
}, './infa.json')

var fs = require('fs')
//Приветствие
require('./intro.js')

//Загрузка конфига
var config = require('./config.js')

//Загрузка текста со списком команд
var help = fs.readFileSync('./help.txt', 'UTF-8')

//Подключение модуля "VK-Promise"
var VK = require("VK-Promise")

//Токен задается в файле "config.js"
var vk = new VK(config.access_token);

//Запуск LongPoll сервера

vk.init_longpoll();

var commands = [
    {com: '/test', reply: 'OK'},
    {com: '/Команды', reply: help},
    {com: '/Когда умер Наполеон?', reply: ['Историю учить надо было, долбоеб!', 'Загугли, или чо блять, тебе еще и подсказать как в гугол войти кек', 'Он умер, когда твоя мамка под стол пешком ходила', '5 мая 1821', 'Незнаю, отыбись', 'А ты с какой целью интерисуешься?', 'Ну что я тебе могу сказать, выглядишь ты как долбоеб, а спрашиваешь такие умные вещи! Подозрительно как то...']},
    {com: '/Где умер Наполеон?', reply: ['На кровати твоей мамки кек', 'На лесобазе', 'На Широтной', 'Он не умер, он жиф', 'Точно не в России', 'Где то там далеко, где нету спайса и анаши', 'не ну я хз, я не шарю в током', 'В пизде. Грубо, зато в рифму']},
    {com: '/От чего умер Наполеон?', reply: ['От цирроза печени', 'От рака матки, он же телкой был', 'От пули в лоб', 'ИВО ЧО УБЕЛЕ ЧТО ЛЕ', 'От твоих тупых вопросов', 'Все из за тебя, я тебе говорю!']},
    {com: '/Зачем умер Наполеон?', reply: ['Что бы потом все создавали его фейки &#128521', 'Его заморозили и скоро он даст пиздов вам', 'Что бы выяснить чо там как на небесеах', 'Прост)))', 'Не важно...', 'Спроси че полегче', 'Нахуй послан уебок']},
    {com: '/С какого ты района Бонапарт?', reply: ['С Широтной конечно', 'В переходе на Максима Горького сижу', 'С элитного', 'Лесобаза', 'КПД еба']},
    {com: '/Бонапарт, го на стрелу к кристаллу', reply: ['Не, я зассал', 'Я в стороне постою', 'Ну приходи, я тебя выебу', 'Чо ито токое крестал?', 'Хм...зря ты конечно меня туда позвал, потому что я выбью тебе зубы так, что чистить их придется тебе через задний проход', 'Го кек']},
    {com: '/Кто сливает Ге?', reply: ['Казанцев', 'Викторовна', 'Якуб', 'Чапский', 'Никто', 'Сокол', 'Архипова', 'Ягода', 'Ялын русский паринь', 'Филятова', 'Поздняк', 'Киррюша', 'Джоник', 'Тарасова', 'Паншин', 'Пидоры кокието', 'Опять слеле зоебали', 'Крысенов']},
    {com: '/Баер', reply: 'Ибанька 2'},
    {com: 'Нормальные есть?', reply: 'Нет, одни норкоманы кокие-то'},  
    {com: '/инфа+', 
        action: (msg, arg)=>{
            var name = arg.shift() // получаем первое слово
            var text = arg.getText(); //получаем остальной текст
            infa.insert({name: name, text: text})
            .write()
        }
    },
    {com: '/инфа', 
        action: (msg, arg)=>{
            var name = arg.shift()
            var r = infa.find({ name: name })
            if (r) {
                var text = 'Инфа про ' + name + ':'
                r.forEach((i)=>{
                    text += '\n- ' + i.text
                })
                msg.reply(text)                
            } else {
                msg.reply('Нет инфы про ' + name) 
            }

        }
    },
]

function doCommand(msg) {
    commands.forEach((command) => {
        if (command.reply) {
            if (command.com.toLowerCase() == msg.body.toLowerCase()) {
                if (Array.isArray(command.reply)) var reply = command.reply[Math.floor(Math.random() * command.reply.length)];
                else var reply = command.reply    
                msg.reply(reply)      
            }
        }

        if (command.action) {
            var arg = msg.body.split(' ')
            Object.defineProperty(arg, "getText", {enumerable: false, writable: true});
            arg.getText = () => {
                return arg.join(' '); 
            }
            var c = arg.shift()
            if (c.toLowerCase() == command.com.toLowerCase()) {   
                command.action(msg, arg)
            }
        }  
    })
}

// Отлов сообщений
vk.on("message", function(event, msg) {

if (msg.body == 'Ga))') {
        msg.send("Onal")
    }
	
if (msg.body.toLowerCase() == 'Га'.toLowerCase()) {
        msg.send("Онал")
    }
	
if (msg.body.toLowerCase() == 'Да, онал'.toLowerCase()) {
        msg.send("Ггг")
    }
	
 if (msg.body.toLowerCase() == '/Кто сливает Ге?'.toLowerCase()) {

        var replies = ['Казанцев', 'Викторовна', 'Якуб', 'Чапский', 'Никто', 'Сокол', 'Архипова', 'Ягода', 'Ялын русский паринь', 'Филятова', 'Поздняк', 'Киррюша', 'Джоник', 'Тарасова', 'Паншин', 'Пидоры кокието', 'Опять слеле зоебали', 'Крысенов']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }
	
if (msg.body.toLowerCase() == '/Бонапарт, расскажи анекдот'.toLowerCase()) {

        var replies = ['Отечественная военная новинка: удлинённый штык для айфона, позволяющий делать селфи во время боя', '— Как ты сюда попал? — спрашивает заключенный у только что прибывшего. — По рассеянности, — отвечает новичок.  — Я хотел украсть невесту, но успел прихватить только приданое. ', 'Поздняя осень. У окна стоят два программиста, новичок и матерый, курят. Новичок (восторженно): — О, снег падает! Матерый (задумчиво, не отрывая взгляда): — Да, 15 килобайт в секунду….', 'На овощном рынке покупатель-женщина длительное время щупает на прилавке подряд все огурцы. Продавщица, смотря на это действие, замечает: - Женщина, не мните огурцы! Всё равно твёрже не будут!', 'Моего парня все время возбуждает то что я плачу, чем сильнее реву, тем сильне у него стоит. (Комментарий: Этому парню, вместо порно, лучше передачу Жди Меня смотреть)', 'Я не понимаю что такое анекдот, поэтому иди ка ты куда шел']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    if (msg.body.toLowerCase() == '/Что меня ждет вечером?'.toLowerCase()) {

        var replies = ['Онал 👉👌😨😌', 'По ебалу получишь😡', 'У тебя будет романтик с любой участницой беседочки на выбор (ну и может чета еще перепадет)😍', 'Куча бабла 🔟0⃣0⃣💲', 'Птичка', 'Ничего', 'Пика дроченая♠ и хуй точеный 🍡', 'Грязное бельишко 👙']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    /* Викторина с вопросами
    Количество вариантов ответов = 2
    Для того что бы бот мог ответить вам,
    правильно ли вы ответили или нет,
    необходимо написать один из вариантов ответа.
    Затем бот выдаст результат в соотвествии
    со строкой из //Варианты ответов */

    if (msg.body.toLowerCase() == '/Задай вопрос'.toLowerCase()) {

        var replies = ['Сколько ног у улитки? \n Напиши свой ответ "/Одна" или "/Две"', 'Кто из президентов США написал свой собственный рассказ про Шерлока Холмса? \n Напиши свой ответ "Франклин Рузвельт" или "Рональд Рейган"', 'Какую пошлину ввели в XII  веке в Англии для того чтобы заставить мужчин пойти на войну? \n Напиши свой ответ "Налог на тунеядство" или "Налог на трусость"', 'Основой для «Сказки о рыбаке и рыбке Пушкина послужила сказка братьев Гримм «Рыбак и его жена». В ней немецкая «коллега» нашей старухи превратилась в: \n Выбери правильный ответ. "Папу Римского" или "Директора рыбзавода"', 'Кто из знаменитых художников за жизнь продал всего одну картину? \n Напиши верный ответ "Ренуар" или "Ван Гог"', 'Российский мультфильм, удостоенный «Оскара», — это… \n Напиши верный ответ "Простоквашино" или "Старик у моря"', 'Один известный писатель рассказывал, что списал образ старушки-вредины со своей бывшей жены. При этом бабулька оказалась удивительно похожей на Коко Шанель. На голове у нее всегда была шляпка со складной тульей, благодаря которой она и получила прозвище. \n Выбери верный ответ "Шапокляк" или "Мадам Баттерфляй"', 'У индейцев из немногочисленного североамериканского племени квакиутл есть традиция: беря деньги в долг, они оставляют в залог… \n Выбери варинат ответа "Амулет" или "Имя"', 'Высота Останкинской башни — 540 метров. Сколько нужно размотать рулонов туалетной бумаги, чтобы получилось столько же метров? \n Выбери правильный вариант ответа "10" или "20"']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    //Варианты ответов

    if (msg.body.toLowerCase() == '/Одна'.toLowerCase()) {

        msg.reply("Какой ты вумный игрок! Правильно!!!😃🎁")
    }

    if (msg.body.toLowerCase() == '/Две'.toLowerCase()) {

        var replies = ['Ну ты и ебанутый(ая)...неверно. Иди загугли ответ!!!😡😡😡', 'Нихуя подобного, думай и отвечай правильно блэт!']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    if (msg.body.toLowerCase() == 'Франклин Рузвельт'.toLowerCase()) {

        msg.reply("Какой ты вумный игрок! Правильно!!!😃🎁 \n \n 32-1 президент США Франклин Рузвельт был известен и как писатель. В 1945 году он попытался воскресить образ знаменитого литературного героя, написав сочинение «Бейкер-стрит фолио: пять записок о Шерлоке Холмсе от Франклина Делано Рузвельта».")
    }

    if (msg.body.toLowerCase() == 'Рональд Рейган'.toLowerCase()) {

        var replies = ['Ну ты и ебанутый(ая)...неверно. Иди загугли ответ!!!😡😡😡', 'Бляяяяяяять ты тупой. НЕ ВЕРНО!!!!!!!!!!!!!!!']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    if (msg.body.toLowerCase() == 'Налог на трусость'.toLowerCase()) {

        msg.reply("Какой ты вумный игрок! Правильно!!!😃🎁 \n \n Англичанам приходилось платить налог на трусость. Им облагали всех, кто не желал принимать участие в войнах во славу короля.")
    }

    if (msg.body.toLowerCase() == 'Налог на тунеядство'.toLowerCase()) {

        var replies = ['Ну ты и ебанутый(ая)...неверно. Иди загугли ответ!!!😡😡😡', 'Нет ни угадал']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    if (msg.body.toLowerCase() == 'Папу Римского'.toLowerCase()) {

        msg.reply("Какой ты вумный игрок! Правильно!!!😃🎁 \n \n Героиня сказки братьев Гримм «Рыбак и его жена» превратилась в папу Римского. И только после желания стать Господом Богом осталась ни с чем.")
    }

    if (msg.body.toLowerCase() == 'Директора рыбзавода'.toLowerCase()) {

        var replies = ['Ну ты и ебанутый(ая)...неверно. Иди загугли ответ!!!😡😡😡', 'Подумай еще хорошенько...']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    if (msg.body.toLowerCase() == 'Ван Гог'.toLowerCase()) {

        msg.reply("Какой ты вумный игрок! Правильно!!!😃🎁 \n \n Единственная проданная при жизни картина Ван Гога — «Красные виноградники в Арле».")
    }

    if (msg.body.toLowerCase() == 'Ренуар'.toLowerCase()) {

        var replies = ['Ну ты и ебанутый(ая)...неверно. Иди загугли ответ!!!😡😡😡', 'Не правильно']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    if (msg.body.toLowerCase() == 'Старик у моря'.toLowerCase()) {

        msg.reply("Какой ты вумный игрок! Правильно!!!😃🎁 \n \n В 2000 году премию «Оскар» вручили российскому режиссеру, художнику-мультипликатору Александру Петрову за лучший короткометражный мультфильм года «Старик и море», снятый по мотивам повести Эрнеста Хемингуэя.")
    }

    if (msg.body.toLowerCase() == 'Простоквашино'.toLowerCase()) {

        var replies = ['Ну ты и ебанутый(ая)...неверно. Иди загугли ответ!!!😡😡😡']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    if (msg.body.toLowerCase() == 'Шапокляк'.toLowerCase()) {

        msg.reply("Какой ты вумный игрок! Правильно!!!😃🎁 \n \n Правильный ответ — Шапокляк.")
    }

    if (msg.body.toLowerCase() == 'Мадам Баттерфляй'.toLowerCase()) {

        var replies = ['Ну ты и ебанутый(ая)...неверно. Иди загугли ответ!!!😡😡😡']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    if (msg.body.toLowerCase() == 'Имя'.toLowerCase()) {

        msg.reply("Какой ты вумный игрок! Правильно!!!😃🎁 \n \n Индеец племени квакиутль, беря деньги в долг, может оставить в залог свое имя. Пока он не возвратит долг, к нему никто не обратится по имени.")
    }

    if (msg.body.toLowerCase() == 'Амулет'.toLowerCase()) {

        var replies = ['Ну ты и ебанутый(ая)...неверно. Иди загугли ответ!!!😡😡😡']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    if (msg.body.toLowerCase() == '10'.toLowerCase()) {

        msg.reply("Какой ты вумный игрок! Правильно!!!😃🎁 \n \n Это всего 10 рулонов (стандартный рулон — 54 метра)")
    }

    if (msg.body.toLowerCase() == '20'.toLowerCase()) {

        var replies = ['Ну ты и ебанутый(ая)...неверно. Иди загугли ответ!!!😡😡😡']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    if (msg.body.toLowerCase() == '/Факты о Бонапарте'.toLowerCase()) {

        var replies = ['Сидит в говнобеседке', 'Помогал строить Наяганьским деревенщинам славный город Тюмень', 'Охранник Ашана', 'Лох. Пидр.', 'Фсе факты в гугле есть', 'Пшла нахуй, инфу ищо копать на меня собрались...крысы ебаные', 'Умер 5 мая 1821 года']

        var reply = replies[Math.floor(Math.random() * replies.length)];
        msg.reply(reply)
    }

    if (msg.body.toLowerCase() == 'Наполеон'.toLowerCase()) {
        msg.reply("Вкусный тортик 😍🎂🎂🎂")
    }

    doCommand(msg)

});
В этом napoleon.js есть пример как записать инфу о ком то, вот к примеру -

Я пишу боту /Инфа+ (ИМЯ) (САМ ТЕКСТ МНОЮ ПРИДУМАННЫЙ)
Далее пишу ему /Инфа (ЧЬЕ УКАЗАЛ ИМЯ ВЫШЕ) и он мне отвечат ИНФА ПРО (ИМЯ) (МОЙ ПРИДУМАННЫЙ ТЕКСТ)

А сохраняет и берет инфу он из файла infa.json

Так вот вопрос! Как сделать еще несколько таких вариаций, типа к примеру

Я пишу ему /(СВОЯ НОВАЯ КОМАНДА) = (ВАРИАНТ ОТВЕТА) и так несколько раз, он все запомнил к примеру в файл comands.json
И введя ему /(СВОЯ КОМАНДА) он отвечал моими заданными вариантами ответов рандомно

Ну и еще на десерт вопросик...

Как сделать что бы можно было например используя в беседке его, назначать ему те или иные права, к примеру присвоить такому то такому то ИД значение что он может добавлять новых участников, а вот такой то нет ну и к премеру что бы не изменяли название в беседке правило, если кто то изменит, бот изменит на исходное.

Помогите пожалуйста разобраться

-------
<b>R</>estart<b>72</>


Отправлено: 20:02, 22-09-2017

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Node.js (JS+DB (на JSON) + VK_API

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Восстановление паролей: проблемы с key3.db и logins.json puhi Хочу все знать 4 04-12-2015 16:12
[решено] JS. Как установить onblur из JS? Sanchos Вебмастеру 2 04-07-2010 13:16
Проблема с меню на js Bullet-Avalon Вебмастеру 10 24-02-2009 22:24
Таймер на JS Vlad Drakula Вебмастеру 8 16-04-2005 22:01
Таймер на js Guest Вебмастеру 7 25-08-2004 12:31




 
Переход