d20pfsrd Discord Bot Scraper Abstraction และ Deployment
ฉันเขียนบอทที่ไม่ลงรอยกันซึ่งรับฟังลิงก์ไปยังกฎ d20pfsrd ในการแชทที่ไม่ลงรอยกันตรวจสอบว่าเป็นความสามารถหรือเวทมนตร์จากนั้นคัดลอกหน้าจัดรูปแบบและพ่นกลับเข้าสู่การแชทเป็นข้อความที่จัดรูปแบบ หน้าเว็บที่ฉันกำลังตรวจสอบนั้นมีสูตรเพียงพอดังนั้นแม้ว่าตัวเลือก Cheerio ที่ฉันใช้อาจค่อนข้างเปราะ แต่ก็ดูเหมือนว่าจะใช้ได้ในกรณีส่วนใหญ่ รูปแบบข้อความเป็นสัตว์ที่น่าเกลียด (แม้ว่าตรรกะอาจไม่ซ้ำกัน) และการเรียกแกนก็สามารถใช้การล้างข้อมูลได้เช่นกัน
ปัญหาของฉันมีดังนี้: ฉันสงสัยว่ารหัสที่ดี 40% สามารถถูก refactored ออกจากการมีอยู่ได้หากฉันสรุปอย่างถูกต้อง วิธีแก้ปัญหาของฉันคือการทำบางสิ่งที่อาจอธิบายได้ว่าเป็นการละเมิดของผู้ดำเนินการแพร่กระจาย:
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);
}
หนึ่งสัปดาห์ต่อมาฉันรู้แล้วว่าฉันเขียนฟังก์ชันในลักษณะที่ทำให้พวกเขาอ่านย้อนหลัง? นอกเหนือจากความสวยงามแล้วนี่คือวิธีการทำงาน:
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);
}
แนวคิดก็คือตรรกะที่ไม่เหมือนใครมากที่สุดเท่าที่ฉันจะแยกได้มีอยู่ใน magic.js และ feats.js เท่าที่จะทำได้ ฉันจะทำความสะอาดส่วนนี้ได้อย่างไร github repo อยู่ที่นี่แล้วและฉันชอบและคำติชมเกี่ยวกับโครงการทั้งหมด ฉันทำส่วนใหญ่เพราะฉันคิดว่ามันแปลกที่มีบล็อกใหญ่ถ้าที่นี่และทำซ้ำการเรียกแกน:
client.on('message', msg => {
if(validateUrl(msg.content)){
const siteUrl = encodeURI(msg.content);
getPage(msg, siteUrl);
}
});
นอกจากนี้ฉันยังเขียนส่วนสำคัญนี้เกี่ยวกับวิธีที่ฉันนำไปใช้กับราสเบอร์รี่ pi ได้ผลดังนั้นข้อเสนอแนะในการปรับปรุงจะได้รับการชื่นชมอย่างมาก
ในจังหวะกว้าง ๆ โปรแกรมนี้:
- ฟังข้อความ
- ตรวจสอบความถูกต้องของข้อความ
- รับเนื้อหาของเพจที่ URL ของข้อความ
- แยกวิเคราะห์เนื้อหาของเพจ
- จัดรูปแบบเนื้อหาของหน้าใหม่
- แปลงเนื้อหาของเพจเป็นข้อความ
- ส่งข้อความ
คำตอบ
นี่คือวิธีที่ฉันจะทำ ย้ายตรรกะเกี่ยวกับหน้าที่ตัวแยกวิเคราะห์ใช้ลงในโค้ดสำหรับโปรแกรมแยกวิเคราะห์ดังกล่าว นอกจากนี้การจัดไฟล์ตัวช่วยของคุณให้เป็นวัตถุสามารถลดความซับซ้อนในแง่ของจำนวนตัวแปรที่คุณส่งผ่านไปได้ แต่นั่นเป็นเรื่องของความชอบส่วนบุคคลมากกว่า
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);
}
}
```