d20pfsrd Discord Bot Kazıyıcı Soyutlama ve Dağıtım
Uyumsuz sohbette d20pfsrd kural kitabına giden bağlantıları dinleyen, beceriler mi yoksa sihir mi olduklarını kontrol eden ve ardından sayfayı sıyırıp biçimlendiren ve biçimlendirilmiş metin olarak sohbete geri gönderen bir uyumsuzluk botu yazdım. Kontrol ettiğim sayfalar yeterince formülsel, bu yüzden kullandığım cheerio seçiciler muhtemelen oldukça kırılgan olsa da, çoğu durumda işe yarıyor gibi görünüyor. Metin biçimlendiricileri yine de bazı çirkin canavarlardır (mantık muhtemelen benzersiz olsa da) ve axios çağrıları da biraz temizlik gerektirebilir.
Benim sorunum şudur: Doğru bir şekilde genelleştirirsem, kodun% 40'ının yeniden düzenlenebileceğinden şüphelendim. Benim çözümüm, muhtemelen yayılma operatörünün kötüye kullanılması olarak tanımlanabilecek bir şey yapmaktı:
async function getPage(msg, url){
let message = "placeholder";
await axios.get(url).then( (response) => {
message = responder(...selectResponder(url), response);
}
).catch((error) => {
console.error(error.message);
});
sendMessage(message, msg);
}
Bir hafta sonra, fonksiyonları geriye doğru okumalarına neden olacak şekilde yazdığımı şimdi anlıyorum. Estetik bir yana, işte böyle sonuçlanıyor:
function selectResponder(siteUrl){
if (siteUrl.startsWith("https://www.d20pfsrd.com/feats/")){
return feats.featsConfig;
} else if (siteUrl.startsWith("https://www.d20pfsrd.com/magic/")){
return magic.magicConfig;
}
}
function responder(parser, formatter, messageFormatter, response){
const replyData = parser(response.data);
const formattedData = formatter(replyData);
return messageFormatter(formattedData);
}
Buradaki fikir, ayırabildiğim kadar benzersiz mantığın magic.js ve feats.js'de olabildiğince var olmasıdır. Bu bölümü nasıl temizleyebilirim? Github deposu burada ve tüm proje hakkında çok sevinir ve geri bildirimde bulunurum. Çoğunu yaptım çünkü burada büyük bir engele sahip olmanın ve axios çağrılarını çoğaltmanın garip olduğunu düşündüm:
client.on('message', msg => {
if(validateUrl(msg.content)){
const siteUrl = encodeURI(msg.content);
getPage(msg, siteUrl);
}
});
Ayrıca ahududu pi'ye nasıl yerleştirdiğime dair bu özü yazdım . Bu işe yarıyor, bu nedenle nasıl iyileştirilebileceğine dair öneriler büyük ölçüde takdir edilecektir.
Geniş vuruşlarda bu program:
- Bir mesajı dinler
- Mesajı doğrular
- Sayfa içeriğini mesaj url'sinden alır
- Sayfa içeriğini ayrıştırır
- Sayfa içeriğini yeniden biçimlendirir
- Sayfa içeriğini bir mesaja dönüştürür
- Mesajı gönderir
Yanıtlar
İşte bunu nasıl yapacağım. Bir ayrıştırıcının hangi sayfaları kullandığı mantığını, söz konusu ayrıştırıcının koduna taşıyın. Ayrıca yardımcı dosyalarınızı nesneler halinde düzenlemek, aktardığınız değişkenlerin sayısı açısından karmaşıklığı azaltabilir, ancak bu daha çok kişisel bir tercih meselesidir.
class SpecificPageParser {
match(url) {
return (
url.startswith('https://www.d20pfsrd.com/magic/') &&
!url.endsWith('/magic/')
);
}
format(response) {
// do your parsing stuff
const formatted = {...response,'extra':'info'};
return formatted;
}
}
const responders = [new SpecificPageParser(),new SomeOtherParser()];
async function getPage(msg, url){
try {
const responder = responders.find(responder=>responder.match(url));
if (!responder) return;
const response = await axios.get(url);
const message = responder.format(response);
sendMessage(message, msg);
}
catch(error) {
console.error(error);
}
}
```