d20pfsrd Discord Bot Scraper Abstraction และ Deployment

Aug 16 2020

ฉันเขียนบอทที่ไม่ลงรอยกันซึ่งรับฟังลิงก์ไปยังกฎ 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 ได้ผลดังนั้นข้อเสนอแนะในการปรับปรุงจะได้รับการชื่นชมอย่างมาก

ในจังหวะกว้าง ๆ โปรแกรมนี้:

  1. ฟังข้อความ
  2. ตรวจสอบความถูกต้องของข้อความ
  3. รับเนื้อหาของเพจที่ URL ของข้อความ
  4. แยกวิเคราะห์เนื้อหาของเพจ
  5. จัดรูปแบบเนื้อหาของหน้าใหม่
  6. แปลงเนื้อหาของเพจเป็นข้อความ
  7. ส่งข้อความ

คำตอบ

1 TedBrownlow Aug 16 2020 at 10:57

นี่คือวิธีที่ฉันจะทำ ย้ายตรรกะเกี่ยวกับหน้าที่ตัวแยกวิเคราะห์ใช้ลงในโค้ดสำหรับโปรแกรมแยกวิเคราะห์ดังกล่าว นอกจากนี้การจัดไฟล์ตัวช่วยของคุณให้เป็นวัตถุสามารถลดความซับซ้อนในแง่ของจำนวนตัวแปรที่คุณส่งผ่านไปได้ แต่นั่นเป็นเรื่องของความชอบส่วนบุคคลมากกว่า

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);
    }
  }
```