dunbot / source /control /model.js
Duongkum999's picture
Upload 56 files
91d9d20 verified
Raw
History Blame Contribute Delete
7.83 kB
var utils = require("../lib/utils");
var log = require("../lib/log");
var { apis } = global.mira;
var { model } = global.database;
var ScheduleInterval;
var bannedAPIs = [
"Messenger",
"Client",
"markAsDelivered",
"markAsRead",
"getUserInfo"
];
async function createDataBase(message) {
var { User, Thread } = model;
var { threadID, participantIDs, isGroup } = message;
if (isGroup) {
try {
await Thread.findOne(threadID);
} catch (error) {
log.error("database.create.fail", threadID, error.message);
console.log(error);
}
} else {
try {
await User.findOne(threadID);
} catch (error) {
log.error("database.create.fail", threadID, error.message);
console.log(error);
}
}
for (var userID of participantIDs || []) {
try {
await User.findOne(userID);
await new Promise(resolve => setTimeout(resolve, 2000));
} catch (error) {
log.error("database.create.fail", userID, error.message);
console.log(error);
}
}
}
async function updateDataBase(message) {
}
function levenshteinDistance(str1, str2) {
var len1 = str1.length;
var len2 = str2.length;
var dp = [];
for (var i = 0; i <= len1; i++)
dp[i] = [i];
for (var j = 0; j <= len2; j++)
dp[0][j] = j;
for (var i = 1; i <= len1; i++) {
for (var j = 1; j <= len2; j++) {
var cost = str1[i - 1] === str2[j - 1] ? 0 : 1;
dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
}
}
return dp[len1][len2];
}
function similarityScore(str1, str2) {
var maxLength = Math.max(str1.length, str2.length);
if (maxLength === 0)
return 1.0;
var distance = levenshteinDistance(str1, str2);
return (maxLength - distance) / maxLength;
}
function findBestMatch(target, possibleMatches) {
var bestMatch = "";
var bestScore = 0;
for (var match of possibleMatches) {
var score = similarityScore(target, match);
if (score > bestScore) {
bestScore = score;
bestMatch = match;
}
}
return {
target: bestMatch,
rating: bestScore
}
}
async function Main(info) {
var allCMD = [...global.modules.cmds];
var { prefix, adminOnly, adminIDs } = global.mira.config.botOptions;
var { language } = require("../../config.json").systemOptions;
var { senderID, threadID, isGroup } = info;
var { User, Thread } = model;
var escapedPrefix = prefix.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
var prefixRegex = new RegExp("^" + escapedPrefix, "i");
var isCalled = prefixRegex.test(info.body);
if (!isCalled)
return;
var [namePlg, ...args] = info.body.replace(prefixRegex, "").trim().split(/\s+/);
var cmd = allCMD.find(item => item[0] === namePlg);
var Messenger = utils.createMessenger(apis, info);
var userData = await User.findOne(senderID);
var userID = parseInt(senderID);
if (adminOnly && !adminIDs.includes(userID))
return;
if (isGroup) {
var threadData = await Thread.findOne(threadID);
if (threadData.banAt > 0 && !adminIDs.includes(userID))
return Messenger.reply(log.parseDir("control.model.threadBanned", [threadData.reason, utils.getTime(null, threadData.banAt)]));
}
if (userData.banAt > 0 && !adminIDs.includes(userID))
return Messenger.reply(log.parseDir("control.model.userBanned", [userData.reason, utils.getTime(null, userData.banAt)]));
if (namePlg.length === 0)
return Messenger.reply(log.parseDir("control.model.noPluginCalled", prefix));
if (!cmd) {
var allPlugins = allCMD.map(item => item[0]);
var bestMatch = findBestMatch(namePlg, allPlugins);
var content = log.parseDir("control.model.notExist", [namePlg, bestMatch.target]);
return Messenger.reply(content);
}
var pl = cmd[1];
var Langs = pl.Langs[language] || pl.Langs[Object.keys(pl.Langs)[0]];
function getText(dir, inputs) {
try {
if (Langs.hasOwnProperty(dir)) {
var content = Langs[dir];
if (inputs.length > 0) {
for (var index = 1; index <= inputs.length; index++)
content = content.replace("%" + index, inputs[index - 1]);
}
content = content.replace(/{p}|{n}/g, match => match === "{p}" ? prefix : namePlg);
return content;
}
return dir;
} catch (error) {
console.log(error);
return dir;
}
}
var subAPIs = { ...apis }
for (var api of bannedAPIs)
delete subAPIs[api];
Messenger.getText = getText;
var util = {
args,
Messenger,
events: info,
...model,
apis: subAPIs
}
try {
pl.Main(util);
} catch (error) {
console.log(error);
}
}
async function Events(info) {
var allCMD = [...global.modules.cmds];
var { prefix, adminOnly, adminIDs } = global.mira.config.botOptions;
var { language } = require("../../config.json").systemOptions;
var { senderID, threadID, isGroup } = info;
var { User, Thread } = model;
var escapedPrefix = prefix.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
var prefixRegex = new RegExp("^" + escapedPrefix, "i");
var isCalled = prefixRegex.test(info.body);
if (isCalled || senderID === apis.getCurrentUserID())
return;
var args = info.body.trim().split(/\s+/);
var Messenger = utils.createMessenger(apis, info);
var userData = await User.findOne(senderID);
var userID = parseInt(senderID);
if (adminOnly && !adminIDs.includes(userID))
return;
if (isGroup) {
var threadData = await Thread.findOne(threadID);
if (threadData.banAt > 0 && !adminIDs.includes(userID))
return;
}
if (userData.banAt > 0 && !adminIDs.includes(userID))
return;
for (var item of allCMD.filter(item => !!item[1].Events)) {
var pl = item[1];
var Langs = pl.Langs[language] || pl.Langs[Object.keys(pl.Langs)[0]];
function getText(dir, inputs) {
try {
if (Langs.hasOwnProperty(dir)) {
var content = Langs[dir];
if (inputs.length > 0) {
for (var index = 1; index <= inputs.length; index++)
content = content.replace("%" + index, inputs[index - 1]);
}
content = content.replace(/{p}|{n}/g, match => match === "{p}" ? prefix : namePlg);
return content;
}
return dir;
} catch (error) {
console.log(error);
return dir;
}
}
var subAPIs = { ...apis }
for (var api of bannedAPIs)
delete subAPIs[api];
Messenger.getText = getText;
var util = {
args,
Messenger,
events: info,
...model,
apis: subAPIs
}
try {
pl.Events(util);
} catch (error) {
console.log(error);
}
}
}
async function Reply(info) {
}
module.exports = {
db: {
createDataBase,
updateDataBase
},
Main,
Events
}