
🦈드림 걸 Gemoy ~ Info AraBotz
February 2, 2025 at 10:33 PM
/* *Update* Didyoumean
* Tanpa *similarity*, *didyoumean* dari npm
* Kemaren masih pake similarity soalnya
* Ini lebih mirip sih barusan nyoba, gabud aja
* Mampir vapisz.web.app
*/
const fs = require('fs')
if (command) {
let c_names = getCaseNames()
const s_threshold = 0.6
function getCaseNames() {
try {
const data = fs.readFileSync('case.js', 'utf8') // Sesuaikan nama file case koe
const c_pattern = /case\s+'([^']+)'/g
const matches = data.match(c_pattern)
return matches ? matches.map(match => match.replace(/case\s+'([^']+)'/, '$1')) : []
} catch (err) {
return []
}
}
function levenshtein(a, b) {
const m = a.length, n = b.length
if (m === 0) return n
if (n === 0) return m
let dp = Array.from({ length: m+1 }, () => Array(n+1).fill(0))
for (let i = 0; i <= m; i++) dp[i][0] = i
for (let j = 0; j <= n; j++) dp[0][j] = j
for (let i = 1; i <= m; i++) {
for (let j = 1; j <= n; j++) {
let cost = a[i - 1] === b[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[m][n]
}
function similarity(a, b) {
let m_length = Math.max(a.length, b.length)
if (m_length === 0) return 1
return (m_length - levenshtein(a, b)) / m_length
}
let b_match = ''
let h_similarity = 0
for (const c_name of c_names) {
let sim = similarity(command.toLowerCase(), c_name.toLowerCase())
let lengthDiff = Math.abs(command.length - c_name.length)
if (sim > h_similarity && lengthDiff <= 1) {
h_similarity = sim
b_match = c_name
}
}
let s_percentage = parseInt(h_similarity * 100)
if (h_similarity >= s_threshold && command.toLowerCase() !== b_match.toLowerCase()) {
let response = `Maaf, command yang kamu berikan salah. Mungkin ini yang kamu maksud:\n\n•> ${prefix+b_match}\n•> Kemiripan: ${s_percentage}%`
m.reply(response)
}
}
// Taruh sebelum switch (command)