d20pfsrd डिस्कोर्ड बॉट स्क्रेपर एब्सट्रैक्शन एंड डेप्लॉयमेंट
मैंने एक डिस्क बॉट लिखा है जो डिसॉर्ड चैट में d20pfsrd रूलबुक के लिंक के लिए सुनता है, चेक करता है कि क्या वे करतब या जादू कर रहे हैं, और फिर पेज को स्क्रैप करता है, इसे फॉर्मेट करता है, और फॉर्मेट किए गए टेक्स्ट के रूप में इसे वापस चैट में भेज देता है। जिन पृष्ठों की मैं जाँच कर रहा हूँ, वे पर्याप्त रूप से फार्मूलाबद्ध हैं, इसलिए भले ही मैं जो चीयरियो चयनकर्ताओं का उपयोग कर रहा हूँ, वे संभवतः काफी भंगुर हैं, यह ज्यादातर मामलों में काम आता है। पाठ स्वरूपक कुछ बदसूरत जानवर हैं (हालांकि तर्क संभवतः अद्वितीय है), और अक्षीय कॉल कुछ सफाई का उपयोग कर सकते हैं।
मेरी समस्या इस प्रकार है: मुझे संदेह था कि यदि मैंने इसे ठीक से सामान्यीकृत किया है, तो एक अच्छा 40% कोड अस्तित्व से बाहर निकाल दिया जा सकता है। मेरा समाधान कुछ ऐसा करना था जिसे संभवतः प्रसार ऑपरेटर के दुरुपयोग के रूप में वर्णित किया जा सके:
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);
}
विचार यह है कि मैं जितना अलग अद्वितीय तर्क पा सकता हूं उतना ही जादू में मौजूद है। जेएस और संभव के रूप में। मैं इस अनुभाग को कैसे साफ कर सकता हूं? जीथब रेपो यहां है और मैं पूरे प्रोजेक्ट पर प्यार और प्रतिक्रिया दूंगा। मैंने ज्यादातर ऐसा इसलिए किया क्योंकि मुझे लगा कि अगर यहाँ ब्लॉक करना और axios कॉल्स की नक़ल करना बड़ा अजीब है:
client.on('message', msg => {
if(validateUrl(msg.content)){
const siteUrl = encodeURI(msg.content);
getPage(msg, siteUrl);
}
});
इसके अलावा, मैंने इस बात को लिखा कि कैसे मैंने इसे रास्पबेरी पाई में तैनात किया। यह काम करता है, इसलिए इसे बेहतर बनाने के सुझाव पर बहुत सराहना की जाएगी
इस कार्यक्रम में व्यापक स्ट्रोक में:
- संदेश के लिए सुनता है
- संदेश देता है
- संदेश 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);
}
}
```