GithubHelp home page GithubHelp logo

qithub-bot / mastogetter Goto Github PK

View Code? Open in Web Editor NEW
18.0 18.0 8.0 632 KB

✅ togetter for Mastodon.

Home Page: https://qithub-bot.github.io/mastogetter/

License: MIT License

HTML 24.93% JavaScript 52.49% CSS 22.58%
demi-togetter mastodon

mastogetter's People

Contributors

blhsrwznrghfzpr avatar dependabot-preview[bot] avatar dependabot[bot] avatar hidao80 avatar keinos avatar paihu avatar sasanquaneuf avatar woxtu avatar yume-yu avatar yumetodo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

mastogetter's Issues

Tabnabbingの脆弱性

target="_blank"を使っている箇所がいくつかありますが、target="_blank"はrel=”noopener”とセットで使うべきかと思います。

移管に伴う README.md の修正

README.md のリンク先が生みの親のリポジトリになっているので、それ含め記述を直したいです。


2020/01/13 10:45 現在

  • リンク先が親リポジトリになっているde45963 で修正済み
  • Origin は @hidao80 さんである旨を盛り込む
  • その他 → 緩募

PR #86 で対応&マージ済み

[提案] 🦊🐦🐷.md の設置

コントリビューターのためのガイドライン

CONTRIBUTING.md をルートに設置してはどうでしょう?

リポジトリコントリビューターのためのガイドラインを定める

プロジェクトに人々がどのようにコントリビュートするべきかを伝えるガイドラインを作成できます。

(『リポジトリコントリビューターのためのガイドラインを定める』 @ GitHub ヘルプより)

ATOM のガイドラインのようなガチマッチョなものでなくて、ブランチの役割やプルリクエスト(以下 PR)先くらいのもので良いと思うのです。

👍×3 or 5項目くらい挙がったら叩き台を作って master に PR したいと思います。


▼ 2020/01/11 16:30 更新

進捗

議題

  • 1. Linter をどうするか【済】
    • JS には Linter は必要ではないか?
      #50 で ESLint の CI を実装済み。
  • 2. 基本ブランチをどうするか【済】
  • 3. 作業ブランチ名の命名ルール【済】
    • そもそもブランチに命名ルールを設ける必要があるか
      #65 で議論中(投票受付中)
      → ブランチの命名ルールは記載しない。ブランチ名よりはコミット・メッセージや PR 時の書き方の方が大事
  • 4. Draft PR 時に必要なコミット【済】
  • 5. コミット・メッセージの推奨する書き方
  • 6. PR 時の推奨する書き方

XSSの脆弱性

外部APIを叩いて取得したtoot(JSON)をパースしてそのまま表示していますが、エスケープ処理がされていないため悪意のあるJSONデータが返却された場合に任意のjavascriptを実行することが可能です。

Qiitadon以外のインスタンスも指定できる仕様ですので、外部データは常に危険であるという前提でエスケープ処理を行う必要があります。

xss payload : https://api.myjson.com/bins/158yga

ユーザー名が正しく表示されない

現象

インスタンス名が https://hogedon.com のときに、トゥートID or URLに https://hogedon.com/web/statuses/012345678901234567 の形式で toot を取得すると、
その toot が他所のインスタンスの toot でも、
ユーザー名が @[email protected] に固定されてしまっています。

原因

https://github.com/hidao80/mastogetter/blob/4750bd7571272b8292050be20323bf118aa8c234/js/common.js#L96
にて、入力されたインスタンス名を表示にしようしていますが、
おそらく API レスポンスから正しい値を取得する必要があります。

Tootの日時表示

Tootの日時が表示されるといいですね。
(急ぎませんので、お時間あるときにご検討お願いいたします)from @[email protected]

コンソールに toot_ids 未定義エラー

「まとめを読み込む」ボタン押下時にコンソールに Uncaught ReferenceError toot_ids is not defined エラーが出ます。

スクリーンショット 2020-01-08 14 09 31

原因

「まとめを読み込む」ボタンの関数内で、グローバルのつもりで toot_ids を見に行っている。

https://github.com/hidao80/mastogetter/blob/1e8fadb0883761f3638fb3d0b5adb228d961731a/js/index.js#L65-L73

対策

common.js で、card_list と同じようにグローバル空間で宣言しておく。

https://github.com/hidao80/mastogetter/blob/1e8fadb0883761f3638fb3d0b5adb228d961731a/js/common.js#L1-L2

PR #40 に追い PUSH で一緒に直しておきます。

まとめの読み込み以外からの個別追加がドラッグ&ドロップできない

現象

初回作成時、プレビューしてから追加するとトゥートがドラッグ&ドロッペないです。既存のまとめを読み込んでからだとできます。

原因

追加時の addCard() 内で appendChild() する際に attribuedraggable &イベントリスナーを追加していないため。

https://github.com/hidao80/mastogetter/blob/6410e904126bc8b8e3bf0bd5b91c89c610c7e879/js/index.js#L43-L52

対応策

1カード(1トゥート)の要素に以下を追加する関数を用意する。

https://github.com/hidao80/mastogetter/blob/6410e904126bc8b8e3bf0bd5b91c89c610c7e879/js/common.js#L102-L106

これにより、以下の件(#46)も対応が楽になると思います。

#mastogetter の draggable 、表示用ページの方でもモリモリ順番変えられるんだけどええんか……?
https://qiitadon.com/web/statuses/103447056096591220 @ Qiitadon より

トゥートの追加をトップに(FIFO but 条件付き)

編集画面でトゥート追加時、従来の最下部に追加していくのでなく、上部に追加していく方法にできないか。

であれば、 編集フォームのすぐ隣に追加したトゥートが表示されるので #78 の「追加したことが目視できる」ことにもなると思います。

しかし、これには条件があって #77 の順番のフリップが実装されてから意味があるのかもしれません。

また、上に足すか下に足すかの選択オプションを付けるは煩雑になるので付けたくありません

わがままですよね。難しい。とりあえず、以下の Issue も見ながらアイデアを練っていきたいと思います。

  • #76 URL 欄をクリックしたら選択状態にして欲しい
  • #77 トゥートの並び順をフリップできるようにして欲しい
  • #78 「トゥートを追加」したらアウトフォーカスもしくはシグナルが欲しい

トゥートの並び順をフリップできるようにして欲しい

現在、まとめの並びが追加順(古い→上、新しい→下)になっています。この並びを逆転フリップする機能が欲しいです。

追加順になること自体はいいのですが、TL を過去に辿りながら追加していった時に、全体の並びを逆にしたくなります。

少数ならドラッグ&ドロップできるのですが、数が多いと並び順もわからなくなり投稿時間を見ないといけなくなります。

まぁ、「TL の一番古い順から現在にさかのぼって追加していけ」と言えば、そうなんですが。追加して見直した時に、逆の方がいいな、と思って。

URLにTooTの情報を列挙すること自体に限界がないか?

Activity Pubの仕様上、Aインスタンスにいるaさんの投稿は任意のインスタンスが知っているとは限りません。

現状どのインスタンスから情報を取ることを試行するかはインスタンス名の部分に入れたたった一つのインスタンスに限定されていますが、これだとそのインスタンスが知っている投稿しか取得できないわけです。

購読(mastodon的にはフォロー)やリブログ(mastodon的にはブースト)を活用してどこか単一のインスタンスはまとめたいすべての投稿を知っている状態にしろとまとめるユーザーに求める(現状)ならそれでもいいのですが、そうでない場合は投稿ごとにどのインスタンスに問い合わせるかを保持しなくてはいけません。

ここで、permlinkに問い合わせるべきすべてのインスタンスのリストを含めなければならなくなります。

URLの長さは制限はないとはしつつも2000文字を超えるべきではないとされています。domain 名の最大長は 253文字 (RFC1035)です。つまり最悪値でわずか10の投稿をまとめただけでURLが2000文字を超えるということになります。

情報の保持をURLではなくgistなりpastebinなりどこかそういう外部サービスに依存するか鯖をたてるかしなければ現実的にはなくなります

この辺をどう考えているかお聞きしたいです。

  1. どこか単一のインスタンスはまとめたいすべての投稿を知っている状態にしろとまとめるユーザーに求める(現状)
  2. N個のインスタンスに問い合れば(N<9程度?)まとめたいすべての投稿を誰かは知っている状態にしろとまとめるユーザーに求める (#37 の実装は面倒くさくなりそう)(関係なかった)
  3. 各投稿ごとにどのインスタンスに問い合わせるかを保持する
    1. URLで頑張る→圧倒的死
    2. 外部サービスに依存
    3. 自鯖を建てる
    4. まとめ主はMastodonの垢を持っていると仮定してTooTに必要な情報を保持する→TLが荒れる
  4. その他

パーマリンクを短縮 URL で

https://hidao80.github.io/mastogetter/*.github.io ドメインなので https://git.io/ の短縮 URL が使える。パーマリンクを短縮 URL で発行したらどうか。

https://git.io/Jej7j

  • cURL でフォームを送信する例
curl -s -L -i https://git.io -F "url=https://hidao80.github.io/mastogetter/p.html?i=https://qiitadon.com&t=103422588059240282,103422611462024633,103422832136585995,103423069795875723,103423087302441993,103423091368850281,103423137489223891,103423155290513020"
  • レスポンスヘッダの Location で短縮 URL を取得できる。
$ curl -s -L -i https://git.io -F "url=https://hidao80.github.io/mastogetter/p.html?i=https://qiitadon.com&t=103422588059240282,103422611462024633,103422832136585995,103423069795875723,103423087302441993,103423091368850281,103423137489223891,103423155290513020" | grep Location
Location: https://git.io/Jej7j
  • パーマリンクに固有名を付ける例
$ curl -s -L \
$  -i https://git.io \
$  -F "url=https://hidao80.github.io/mastogetter/" \
$  -F "code=mastogetter" | grep Location
Location: https://git.io/mastogetter

URL 欄をクリックしたら選択状態にして欲しい

編集画面の「トゥートID or URL」で、URL をコピペするときに1つ前の URL があった場合、いったん全文選択 or 削除しないとペーストが差し込みになってしまう。

フィールドをクリック(フォーカス)が当たったら全文選択(ctrl+a or ⌘+a を押した)状態にして欲しい。

スクリーンショット 2020-01-11 19 46 31

「トゥートを追加」したら input にフォーカスを戻して欲しい

トゥートが追加されたら input フィールドにフォーカスが戻って欲しい。

まとめ編集画面と TL の2画面で、左から右へのコピペ作業に入ると、まとめ一覧が縦にどんどん伸びて行きます。

この時、トゥートが最下部に追加されるので「あれ?今のちゃんと追加されたかな?」となる時があります。

ポンポン作業していると Qiitadon のレスポンスが一瞬遅くなる時があるのですが、私の場合、この時テンポが崩れ不安になりチェックしにスクロール作業が発生します。

無事追加されたら、何かしらのシグナルが欲しいです。色が変わるとかでも良いです。

個人的には最後に触った Input フィールドにフォーカスが戻ってくれると、まとめ作業が捗ります。

右側のまとめ一覧をインラインフレームにする要望もありますが、それはまた今度別の Issue で。


この初期 Issue には下記の2つの要件が入っていました。

  1. 無事トゥートが追加されたことが目視でわかるようにして欲しい。
  2. 連続でトゥートを追加するため、無事トゥートが追加されたら URL のインプットフィールドにフォーカスが当たって欲しい。

2020/01/12 現在、1 に関しては #80 (comment) の対応で網羅できそうなので、この issue では 2 について議論しています。

`feature-dev` `design-dev` ブランチの `master` 統合

現在、どのブランチが皆さん的にベストな状態になっているのかわかりまてん。

https://github.com/hidao80/mastogetter/issues/54#issuecomment-572590606gh-pages master 2本立て化のステップとして DEV 系ブランチを削除して減量して欲しいです。

もし、その作業で消えてしまったものが出ても「消せらセラ」でまた皆んなで直すということで。

👍 ×4 以上 or @hidao さんの裁量で判断願います。

ESLint: Lower Camel Case に統一してはどうか

JavaScriptのProjectでは一般にcamel caseを採用することが多く、ESLintもcamelCaseであることを要求するルールはあるものの
https://eslint.org/docs/rules/camelcase#
snale_caseであることを要求するルールは存在しません。もちろんそういうpluginはあった気がしますが。

そこでcamelCaseを採用することで統一してはどうかと提案します。

[投票] 作業ブランチ名の命名にはルールを設けるべきか

#54 の「CONTRIBUTING.md のファイルの設置」とは関係がないので新たに本 Issue を立てました。

議題

以下をこの Issue で議論にしたいと思います。

  1. そもそも作業ブランチ名に命名ルールを設ける必要があるのか
  2. 設ける場合は「ブランチの命名ルール」

議題 1 に関しては以下のリアクションでお願いします。

(× 5 以上 or 土曜 01/11 の昼の最多で決定です) 👍= 0 で「作業ブランチの命名ルールは必要なし」となりました。(2020/01/10 18:20)

👍 = 設けた方がいい
👎 = 設けなくてもいい
👀 = 見つめていたい
🚀 = がんばってモチベあげて
🎉 = パーリーピーポー
😕 = そのノリも意味もよくわかりません

叩き台の初回内容と意図

叩き台では、「推奨」するスタイルとして以下をあげました。(hidao80@18a5930#diff-6a3371457528722a734f3c51d9238c13R32-R43 より)


  • 推奨するブランチ名の付け方([] は任意です)
    • issue-<Issue番号>-<担当者名>[-<作業概要>]
      • 特定 Issue の対応を行う。
      • Issue の一部の作業である場合は、作業の概要がわかる名前を付けてください。
    • issue-<Issue番号>[-<作業概要>]
      • 担当者名を付けない場合は「他のコラボレーターからも差し込みをして欲しいブランチ」である意味になります。
      • Issue の一部の作業である場合は、作業の概要がわかる名前を付けてください。
    • typo-<担当者名>
      • 単純な誤字脱字の修正する。
    • refactor-<担当者名>[-<対象>]
      • リファクタリングをする。
        • 特定ファイルのリファクタの場合は、対象がわかる名前を付けてください。

叩き台で「ブランチ名に担当者名はいらないのではないか」という意見 https://github.com/hidao80/mastogetter/pull/64#issuecomment-572845728 をいただきました。実は、叩き台に間違いがありまして、担当者名は任意のつもりでした。

- `issue`-`<Issue番号>`-`<担当者名>`[-`<作業概要>`]
+ `issue`-`<Issue番号>[`-`<担当者名>`-`<作業概要>`]

この <担当者名> を付ける・付けないですが、

  1. <担当者名> あり:「作業ブランチへの他者コミットを希望している」という意思表示
  2. <担当者名> なし:「レビューまで俺にまかせておくれ」

にしたいと考えました。

基本的に「PR を投げた人が1人で作業するもの」というのはわかっています。しかし LTL や今までのやりとりを見て、このリポジトリにおいては以下を念頭におかないといけないと思います。

  • GitHub でコラボったことない
  • 作業フローが各々慣れたものと違う
  • コミット履歴をトレースするの面倒
  • 本業もあるので、なかなか PR を仕上げられない
  • 叩き台は作ったからあとは任せた
  • ちっ何やってんだよ。俺にやらせてみな。ほらよっ。じゃな
  • 進捗確認箇所が多い( LTL, 特定トゥートのスレッド, Issue など)

そういう意味で、「ブランチ名を一見して条件がわかるといいのに」と思い、叩き台に記載しました。

ただ ... ここまで書いておいて何ですが、ブランチ名よりは PR 時のタイトルの方が大事なんじゃね?と思ってきました。本文に「途中コミットキボンヌ」と書いておけばいいんだし。ブランチ名いらないってそういうことだったのか。とほほ。とりあえず土曜の夜まで意見募集お昼に決定しまーす。

まとめを複数回読み込むと表示とpermalinkが合わなくなる

症状: まとめを複数回読み込んで、permalinkをコピーすると、最後に読み込んだまとめと同じものになる。(すでに存在しているtootが存在しないかのように振る舞う)

原因: まとめを読み込むと、リストの後ろに追加されるけれど、
permalink的には、既存のものがなかったことになって、読み込んだものだけになってしまっている。

対策:

  • 読み込んだ際に表示を一旦クリアし、仕様とする。
  • card_list に読み込んだ toot_ids を追加する。

追加済みの toot を削除できるように

URL から物理的に id を消す方法で削除できなくは無いですが、
編集ページで削除ができるようになってほしい。

追加された toot が最下段に追加されるため、目視で追加されたかがわかりにくく、
複数回同じ toot を追加してしまったので。

local serverを指定してしまってnpm script化したほうがいいのではないか

file://だとCORSとかの関係で扱いに困るので適当なlocal serverを選出したほうがいいのではないかと思いました

ref:

候補としては

など?webpack使ってないので軽量なやつで十分ですし。(後者のほうがメンテされていそう)

npm scriptを書いてnpm run startとかするとブラウザで見れるようにするのをイメージしてます。

ページネーションしない

ページネーションしないため、件数が多いまとめを見るときは初期ロードに時間がかかる。
また、全件一括取得した場合、サーバに負担がかかる。

ソース内の絶対パスをダイナミックに

コミット 241b81d の時点で、パーマリンクの URL が絶対パスになっています。

mastogetter/js/common.js

Lines 74 to 81 in 241b81d

function updatePermalinkFromCardList() {
console.log("Updaing permalink from card_list.");
let permalink = "https://hidao80.github.io/mastogetter/p.html?i=" + $("instance").value + "&t=";
Object.keys(card_list).forEach(function(key) {
permalink += card_list[key] + ",";
});
$("permalink").value = permalink;
}

MIT であるため派生 mastogetter も生まれる可能性もありますし、何よりローカルで確認する際にドメインのベース部分をローカルに書き換える必要もあります。

提案

  • パーマリンクの URL のベースを、現在開いている URL のものにする。

Mergify.IO (自動マージ機能)を導入したい

CircleCI をパスして、レビューに n 件の LGTM(Approve)が付いたら、もぅ強制的に master にマージさせたい。 (👍 ×3 以上で可決)

また、Approve できるレビューアーはコラボレーター(リポジトリ大臣)に限定せず、コントリビューター(ユーザー)も参加できるようにする。

P.S.
リリース(mastergh-pages にマージ)するタイミングは、コラボレーターの多数決で適宜行うこととする。可能なら、これも自動化につなげていきたい。

リアクティブなプレビュー

トゥートのIDやURLが入力されたときに「埋め込みカードのプレビュー」がシュッと表示されると良さそう。都度プレビューのボタンを押すのは面倒なので。

バージョン1にv2のようなURL圧縮機能を互換性を維持したまま実装できないか

#62 (comment)
話がそれますが互換性破壊せずともget paramの名前変えれば済んだのでは・・・?

と書いたのですが、get paramの名前変えるまでもなく互換性を維持できると思ったのでIssue立てました。

現状Get Paramは

  • i: instance 名
  • t: Toot id の配列(,区切り)

となっていると思うのですがv2で互換性を破壊したのは

mastogetter/v2/js/common.js

Lines 118 to 131 in 241b81d

function tootIdsUncompress(toot_ids_csv) {
const toot_ids_ary = toot_ids_csv.split(',');
let tmp_toot_id;
let uncompress_toot_id;
let tmp;
for (let i = 0; i < toot_ids_ary.length; i++) {
tmp_toot_id = toot_ids_ary[i].split("_");
uncompress_toot_id = parseInt(tmp_toot_id[0], 36).toString();
tmp = parseInt(tmp_toot_id[1], 36).toString();
uncompress_toot_id += ("00000000000" + parseInt(tmp)).slice(-tmp.length);
toot_ids_ary[i] = uncompress_toot_id;
}
return toot_ids_ary;
}

の処理を必ず適用していたためでした。
_を含めば36進数変換処理が入っていると区別ができるので単にその処理を追加すればよかったはずです。

つまり、まとめの表示とまとめ作成時の読み込み機能については両対応し、新規生成は36進数変換に変更すれば互換性は壊れていないものと思います。

Google検索にかけた感じ、v2は使われてる形跡がないので削除し、上記の様に統合しませんか?

作成済みパーマリンクを読み込み、トゥート追加するとパーマリンクが未完全になる

TL;DR

発行済みパーマリンクに追加されまてん。

  • Chrome v79.0.3945.88, macOS Mojave

TS;DR

再現方法

https://hidao80.github.io/mastogetter/p.html?i=https://qiitadon.com&t=103422588059240282,103422611462024633,103422832136585995,103423069795875723,103423087302441993,103423091368850281,103423137489223891,103423155290513020,103423839710682996

上記パーマリンクを、ますとげったーの「パーマリンク読込」に貼り付け、追加したいトゥート
https://qiitadon.com/web/statuses/103433642368719830
を「トゥートID or URL」に貼り付けました。

「プレビュー」でちゃんと表示されたので、「プレビュー中のトゥートを追加」したところ、右側ペイン(トゥート一覧)の最後尾に追加されました。

しかし、右側ペイン上部にある「パーマリンク」の input フィールドが最後に追加したトゥート ID のみになってしまいます。

https://hidao80.github.io/mastogetter/p.html?i=https://qiitadon.com&t=103433642368719830,

2連続「プレビュー中のトゥートを追加」を押下すると、同じトゥートが追加されるので、リセットして追記しているわけではないようです。

https://hidao80.github.io/mastogetter/p.html?i=https://qiitadon.com&t=103433642368719830,103433642368719830,

「パーマリンク読込」の「読込」ボタン押下時は、右側ペイン上部の input フィールドに既存のパーマリンクは流し込まれているようなので、初回「プレビュー中のトゥートを追加」時に消えてしまいます。

考えられる原因

おそらく、パーマリンク読込ボタンの loadPermalink() 時に genPermalink() でパーマリンク作成後、toot_list もちくは card_list に追加していないからなのかな、と思います。

https://github.com/hidao80/mastogetter/blob/435b615222fe9a606bf15fff8469ee55aa567726/js/index.js#L81-L126

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.