방출 0.4, 중간점
7194 단어 opensource
나는 Mousehunt Timer 로봇에 feature request을 설치하기로 결정하고 계속 노력하고 있다.
이 과정은 다른 명령의 코드와 유사합니다. agiletravels database 에서 정확한 항목을 검색한 다음 찾을 수 있는 항목 목록을 출력해서 사용자가 읽을 수 있도록 합니다.쉬워 보이죠?
첫 번째 단계는 다른 명령의 코드를 보고 외관과 행동이 비슷한 명령을 어떻게 만드는지 생각하는 것이다.그리고, 나는bot이 정보를 어떻게 표시하는지 연구해야 한다. (내가 이전에 버그를 복구했을 때 이렇게 한 것). 그리고 표시할 정확한 정보를 설정해야 한다.
이것은 또 다른 생생한 파일이 될 것이며, 나는 이 문제를 처리할 때 업데이트할 것이다.계속 봐주세요!
제1교시
나의 첫 업무 회의에서, 나는 먼저 이 명령을 만드는 과정을 열거했다.
나는
next
명령의 코드를 복제하기로 결정했다. 왜냐하면 이것은 가장 간단한 것 같다. 사용자가 어떤 매개 변수를 제공하지 않아도 되기 때문에 디스코더 로봇의 진정한 작업 원리를 신속하게 이해할 수 있다.그럼 디스코트 로봇의 명령은 어떻게 작동합니까?기본적으로, 당신의 색인에 있습니다.js 파일 (MHTimer.js) 을 만들고 집합을 만들고 다음 코드를 사용하여commands 폴더의 내용을 채웁니다.사실 아주 간단해요.
const Discord = require('discord.js');
const client = new Client({ disabledEvents: ['TYPING_START'] });
client.commands = new Collection();
const commandFiles = fs.readdirSync('src/commands').filter(file => file.endsWith('.js'));
for (const file of commandFiles) {
try {
const command = require(`./commands/${file}`);
if (command.name) {
if (typeof(command.canDM) === 'undefined') {
command.canDM = true;
Logger.log(`Set canDM to true for ${command.name}`);
}
if (command.initialize) {
command.initialize().catch((err) => {
Logger.error(`Error initializing ${command.name}: ${err}`);
throw err;
});
}
client.commands.set(command.name, command);
} else {
Logger.error(`Error in ${file}: Command name property is missing`);
}
} catch (e) {
Logger.error(`Could not load ${file}:`, e);
}
}
Logger.log(`Commands: Loaded ${client.commands.size} commands: ${oxfordStringifyValues(client.commands.map(command => command.name))}`);
이 코드는 MHTimerBot에서 왔으며 모든 사용자에게는 적용되지 않습니다.자세한 내용은 the Discord docs를 참조하십시오.이번 회의는 시간이 짧아서 문제의 저자가'ifind에서 사용할 수 있는 전리품 닉네임'을 지정할 때의 생각을 알아내기로 했습니다.
const all_loot = getLoot(searchString, message.client.nicknames.get('loot'));
if (all_loot && all_loot.length) {
// We have multiple options, show the interactive menu
urlInfo.qsParams = opts;
sendInteractiveSearchResult(all_loot, message.channel, formatLoot,
['dm', 'group'].includes(message.channel.type), urlInfo, searchString);
theResult.replied = true;
theResult.success = true;
theResult.sentDM = ['dm', 'group'].includes(message.channel.type);
나는 이것이 그들이 말한 코드 블록이라고 믿기 때문에, 두 번째 세션에서 명령을 작성할 때, 나는 그것을 통합하려고 시도할 것이다.제2절
나는 두 번째 수업을 시작할 때 약간의 장애에 부딪혔다.
기본적으로 기본 명령으로 이전 세션을 끝내는 것은 오류가 아닐 수도 있지만, 이것은 확실히 내가 해야 할 일이 많다는 것을 의미한다.이 장애는 내가 디스코더 로봇이 어떻게 작동하는지 모른다고 생각했기 때문이다.30분 동안 다른 명령을 쳐다보며 내 명령을 어떻게 작성하는지 이해하려고 애쓴 후, 나는 명령이 무엇을 해야 하는지, 코드에 있는 위치를 정확하게 그려내기로 결정했다.
message ->
getConvertibles() [match search term with database items] ->
formatConvertibles() [get possible items and quantity, display in columns]
이것은 내가 나의 명령이 통과하기를 바라는 대략적인 노선이다.마우스와 전리품 찾기 명령에 사용된 노선도 반영했다.이 점을 이해한 후에 나는 인코딩을 시작할 수 있다.
whatsin의 주 코드입니다.js
const theResult = new CommandResult({ message, success: false, sentDM: false });
let reply = '';
const opts = {};
const urlInfo = {
qsParams: {},
uri: 'https://agiletravels.com/converter.php',
type: 'convertible',
};
if (!tokens)
reply = 'I just cannot find what you\'re looking for (since you didn\'t tell me what it was).';
else {
const searchString = tokens.join(' ').toLowerCase();
const all_convertibles = getConvertibles(searchString, message.client.nicknames.get('mice'));
if (all_convertibles && all_convertibles.length) {
// We have multiple options, show the interactive menu
urlInfo.qsParams = opts;
sendInteractiveSearchResult(all_convertibles, message.channel, formatConvertibles,
['dm', 'group'].includes(message.channel.type), urlInfo, searchString);
theResult.replied = true;
theResult.success = true;
theResult.sentDM = ['dm', 'group'].includes(message.channel.type);
}
이것은 우리의 발견과 매우 가깝다.js 또는 ifind.js가 닮았어요.command와 같은api를 사용하여 거의 똑같은 일을 완성하려고 하기 때문에, 나는 많은 코드를 다시 사용할 수 있다고 믿는다.나는 이번 회의에서 약간의 좌절을 만났지만, 대다수는 처리하기 쉽다.나에게 폐를 끼치는 유일한 일은 이 문제를 해결하는 것이다.map () 함수.나는 필요 없을 때 실수로 필터를 하나 썼다.
formatConvertibles()에서 발췌
const converter = results
.map(convertible => {
return {
item: convertible.item.substring(0, 20),
average_qty: convertible.total_items / convertible.total,
};
});
const order = ['item', 'average_qty'];
const labels = { item: 'Item', average_qty: 'Average Qty' };
두 번째 수업이 끝났을 때 나는 자신감을 느꼈고 다음 수업의 테스트 작업을 시작할 준비를 했다.회의
이것은 마지막 회의이거나 적어도 마지막 계획의 회의이다.
이번 회의의 전체 내용은 내가 코드를 조금 정리하고pull 요청을 주요 개발자에게 보내는 것이다.
즉, 만약 그들이 나에게 어떤 변경을 필요로 하거나, 만약 그들이 나에게 테스트를 추가하라고 요구한다면, 나는 여기에 이 과정을 기록할 것이다.
따라서 우리는 다음 두 가지를 해야 한다. 테스트를 계속 만들고 줄의 끝을 복원하는 것이다.상당히 간단한 두 가지 일.
테스트 코드는sinon에서 작성합니다.js는 내가 잘 모르는 틀이지만 너무 많은 문제를 가져와서는 안 된다.
내가 어떻게 테스트를 해야 할지 생각할 때 약간의 어려움을 겪었다는 것이다.자매 파일에 구축된 새로운 기능을 포함하기 위해mhct 검색 파일에 테스트를 추가해야 합니까?아니면 새 명령을 위한 테스트 파일을 만들어야 합니까?나는 둘 다 해야 한다고 생각한다.
그리고 테스트 파일을 사용한 지 몇 시간 후에 나는 한 파일에서 함수를 시뮬레이션하고 다른 파일에서 그것을 시뮬레이션할 때 두 번째 파일을 완전히 파괴하고 테스트를 파괴하는 것을 발견했다.나는 테스트 규모를 줄이든지, 아니면 어떤 해결 방법을 찾든지 한다.
Reference
이 문제에 관하여(방출 0.4, 중간점), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/fluentinstroll/release-0-4-the-halfway-point-26b3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)