paul's notebooks

  • LanguageBot Slack Bot - /paul/languagebot-slack-bot
    Last edited 5 years ago
    const express = require("express"); const { createEventAdapter } = require("@slack/events-api"); const { RTMClient } = require("@slack/rtm-api"); const quizWordPairs = [ ["enseñar", /(to\s+)?teach/i], ["trabajar", /(to\s+)?work/i], ["aprender", /(to\s+)?learn/i], ["jugar", /(to\s+)?play/i], ["dormir", /(to\s+)?sleep/i], ["comer", /(to\s+)?eat/i], ["beber", /(to\s+)?drink/i] ]; function getNextWordPair() { return quizWordPairs[Math.floor(quizWordPairs.length * Math.random())]; } const rtm = new RTMClient(process.env.SLACK_BOT_TOKEN); await rtm.start(); const slackEvents = createEventAdapter(process.env.SLACK_SIGNING_SECRET); async function postSlackMessage(text, channel) { const start = Date.now(); await rtm.sendMessage(text, channel); return Date.now() - start; } const app = express(); app.get("/", async (req, res) => { const duration = await postSlackMessage("It works!", "DQAA6NQGG"); res.end(`Sent test message in ${duration}ms.`); }); app.use("/languagebot-events", slackEvents.requestListener()); const answerRegexByUser = new Map(); slackEvents.on("message", async (event) => { if (event.bot_id) { // ignore messages from bots (i.e. itself) return; } const answerRegex = answerRegexByUser.get(event.user); if (answerRegex) { if (answerRegex.test(event.text)) { await postSlackMessage("Correct!", event.channel); answerRegexByUser.delete(event.user); } else { await postSlackMessage("Try again!", event.channel); } } else { if (/q+u+i+z+(i+n+g+)?\s*me/i.test(event.text)) { const wordPair = getNextWordPair(); answerRegexByUser.set(event.user, wordPair[1]); await postSlackMessage(`What does \`${wordPair[0]}\` mean in Spanish?`, event.channel); } else { await postSlackMessage("Say \"quiz me\" to get quizzed!", event.channel); } } }); app.listen(0);
  • Get Open TCP Ports - /paul/open-tcp-ports
    Last edited 5 years ago
    // Some context: https://stackoverflow.com/a/32589502 // For an explanation of the full /proc/net/tcp file format, see: https://gist.github.com/jkstill/5095725 const procNetTcp = require("fs").readFileSync("/proc/net/tcp", "utf-8"); const openTcpPorts = procNetTcp.split("\n") .slice(1, -1) .map(l => l.trim().split(/\s+/)) .filter(p => p[2] === "00000000:0000") // only look at open ports .map(p => parseInt(p[1].split(":")[1], 16));
  • RunKit WASM Hello World - /paul/wasm
    Last edited 5 years ago
    const libwabt = require("wat2wasm/libwabt"); const { TextDecoder } = require("util"); function compileWat(watStr, imports = {}) { return new Promise((resolve, reject) => { libwabt().then(wabt => { const buffer = wabt.parseWat("", watStr).toBinary({}).buffer; resolve(new WebAssembly.Instance(new WebAssembly.Module(buffer), imports)); }).catch(reject); }); } const watStr = ` (module (import "console" "log" (func $log (param i32 i32))) (import "js" "mem" (memory 1)) (data (i32.const 0) "Hello World!") (func (export "hello") i32.const 0 ;; pass offset to log i32.const 12 ;; pass length to log call $log) ) `; const memory = new WebAssembly.Memory({initial:1}); function consoleLogString(offset, length) { var bytes = new Uint8Array(memory.buffer, offset, length); var string = new TextDecoder("utf8").decode(bytes); console.log(string); } const { hello } = (await compileWat(watStr, { console: { log: consoleLogString }, js: { mem: memory } })).exports; hello();