Glanceway Glanceway
すべてのソース

StackOverflow Hot

開発者 v1.0.0

Hot questions from StackOverflow

@codytseng #stackoverflow #programming #qa

設定項目

名前 キー タイプ 必須 デフォルト 説明
Tag TAG list いいえ Filter by tag (e.g. javascript, python, react). Leave empty for all tags.
Sort SORT select いいえ hot Sort order for questions
hotactivityvotescreationweekmonth

ソースコード

version: 1.0.0
name: StackOverflow Hot
description: Hot questions from StackOverflow
author: codytseng
author_url: https://github.com/codytseng
category: Developer
tags:
  - stackoverflow
  - programming
  - qa

config:
  - key: TAG
    name: Tag
    type: list
    required: false
    description: Filter by tag (e.g. javascript, python, react). Leave empty for all tags.
  - key: SORT
    name: Sort
    type: select
    required: false
    default: hot
    description: Sort order for questions
    options:
      - hot
      - activity
      - votes
      - creation
      - week
      - month
module.exports = async (api) => {
  const tags = api.config.get("TAG") ?? [];
  const sort = api.config.get("SORT") || "hot";

  async function fetchData() {
    const toItems = (questions) =>
      questions.map((q) => ({
        id: q.question_id.toString(),
        title: q.title,
        subtitle: `${q.score} votes · ${q.answer_count} answers · ${q.tags.slice(0, 3).join(", ")}`,
        url: q.link,
        timestamp: q.creation_date,
      }));

    if (tags.length > 0) {
      const pageSize = Math.min(100, Math.floor(500 / tags.length));
      await Promise.allSettled(
        tags.map(async (tag) => {
          const res = await api.fetch(
            `https://api.stackexchange.com/2.3/questions?order=desc&sort=${sort}&site=stackoverflow&pagesize=${pageSize}&tagged=${encodeURIComponent(tag)}`,
          );
          if (res.ok && res.json) {
            api.emit(toItems(res.json.items));
          }
        }),
      );
    } else {
      const res = await api.fetch(
        `https://api.stackexchange.com/2.3/questions?order=desc&sort=${sort}&site=stackoverflow&pagesize=100`,
      );
      if (!res.ok || !res.json) {
        throw new Error(`Failed to fetch Stack Overflow questions (HTTP ${res.status})`);
      }
      api.emit(toItems(res.json.items));
    }
  }

  await fetchData();

  return {
    refresh: fetchData,
  };
};