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,
  };
};