From e3302fa16399ad0f2560bb4f295c054941b167c4 Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Mon, 19 Apr 2021 19:29:55 +0200 Subject: [PATCH] ci, tools: Automatically generate contributor attribution files Also includes a tool to convert Patreon Membership .csv files into a support patch set. --- .github/workflows/authors.yml | 30 +++ AUTHORS.md | 347 ++++++++++++++++++++++---- data/thanks.json | 298 ++++++++++++++++++++++ tools/.gitignore | 1 + tools/convert-patreon-csv.js | 30 +++ tools/generate-contributors.js | 329 ++++++++++++++++++++++++ tools/package-lock.json | 79 ++++++ tools/package.json | 5 + tools/patch-contributors-crowdin.json | 1 + tools/patch-contributors-git.json | 1 + tools/patch-supporters-github.json | 1 + tools/patch-supporters-patreon.json | 86 +++++++ 12 files changed, 1160 insertions(+), 48 deletions(-) create mode 100644 .github/workflows/authors.yml create mode 100644 data/thanks.json create mode 100644 tools/.gitignore create mode 100644 tools/convert-patreon-csv.js create mode 100644 tools/generate-contributors.js create mode 100644 tools/package-lock.json create mode 100644 tools/package.json create mode 100644 tools/patch-contributors-crowdin.json create mode 100644 tools/patch-contributors-git.json create mode 100644 tools/patch-supporters-github.json create mode 100644 tools/patch-supporters-patreon.json diff --git a/.github/workflows/authors.yml b/.github/workflows/authors.yml new file mode 100644 index 00000000..6220b8df --- /dev/null +++ b/.github/workflows/authors.yml @@ -0,0 +1,30 @@ +name: Refresh +on: + schedule: + - cron: '0 0 * * 0' + push: + branches: + - 'master' + +jobs: + update-authors: + runs-on: ubuntu-latest + name: "Update Authors" + steps: + - name: "Checkout" + uses: actions/checkout@v2 + - name: "Generate Authors file" + shell: bash + env: + CROWDIN_PROJECTID: "343435" + CROWDIN_TOKEN: ${{ secrets.AUTH_TOKEN_CROWDIN }} + GITHUB_TOKEN: ${{ secrets.AUTH_TOKEN_GITHUB }} + run: | + git checkout -b authors + pushd ./tools > /dev/null + npm install + node ./generate-contributors.js "${{ github.workspace }}/AUTHORS.md" "${{ github.workspace }}/data/thanks.json" + popd /dev/null + git add . + git commit -a -m="project: Generate contributor attribution files" + git push -f diff --git a/AUTHORS.md b/AUTHORS.md index e34095d0..62762e23 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -1,54 +1,305 @@ -# Authors -This project is made possible by [all supporters on Patreon](https://www.patreon.com/Xaymar), [all translators on Crowdin](https://crowdin.com/project/obs-stream-effects) and the programmers that have spent time on this. +# StreamFX Contributors & Supporters -## Programmers -* Cat Stevens -* Michael Fabian 'Xaymar' Dirks -* wwj402 +## Contributors + +### Code, Media +Thanks go to the following people, who have either wrangled with code or wrangled with image editors while saving often in the hopes of not losing any changes: + +* [Brandon Edens](https://github.com/undefined/graphs/contributors) +* [Carlos Baraza](https://github.com/undefined/graphs/contributors) +* [Cat Stevens](https://github.com/undefined/graphs/contributors) +* [Charles Fettinger](https://github.com/undefined/graphs/contributors) +* [Christopher P Yarger](https://github.com/undefined/graphs/contributors) +* [Daniel Hodgson](https://github.com/undefined/graphs/contributors) +* [Daniel Molkentin](https://github.com/undefined/graphs/contributors) +* [Michael Fabian 'Xaymar' Dirks](https://github.com/undefined/graphs/contributors) +* [Radegast-FFXIV](https://github.com/undefined/graphs/contributors) +* [Robert Moggach](https://github.com/undefined/graphs/contributors) +* [Vainock](https://github.com/undefined/graphs/contributors) +* [William Pettersson](https://github.com/undefined/graphs/contributors) +* [coolsoft.rf](https://github.com/undefined/graphs/contributors) +* [kilin](https://github.com/undefined/graphs/contributors) +* [tytan652](https://github.com/undefined/graphs/contributors) +* [wwj402](https://github.com/undefined/graphs/contributors) + +### Translators +[StreamFX relies on crowd-sourced translations to be available in your language.](https://github.com/Xaymar/obs-StreamFX/issues/36) Much thanks go out to all volunteer translators who have taken some time to submit translations on Crowdin. + +* [A Ismaili](https://crowdin.com/profile/achimismaili) +* [Adolfo Jayme](https://crowdin.com/profile/fitoschido) +* [Alex E. D. B.](https://crowdin.com/profile/alexedb) +* [Alexander Haffer](https://crowdin.com/profile/AlexanderHaffer) +* [AmirGhorbani_ir](https://crowdin.com/profile/AmirGhorbani_ir) +* [Arcan Yiğit Taşkan](https://crowdin.com/profile/karamizahim) +* [Artem](https://crowdin.com/profile/Artem4ik) +* [Arthur](https://crowdin.com/profile/Skor_X) +* [Aurora Robb Kristiansen](https://crowdin.com/profile/Ridge) +* [Billy_la_menace](https://crowdin.com/profile/Symor) +* [Boris Grigorov](https://crowdin.com/profile/boris.grigorov26) +* [Bruno Pinho](https://crowdin.com/profile/BPinho) +* [Byunghun An](https://crowdin.com/profile/kloydhere) +* [Cerbion](https://crowdin.com/profile/Cerbion) +* [Chris BDS](https://crowdin.com/profile/HakuKaze) +* [Claudio Alvez](https://crowdin.com/profile/claudiogodofwar37) +* [Claudio Nunes](https://crowdin.com/profile/_claudionunes_) +* [ColdusT](https://crowdin.com/profile/ColdusT) +* [CyberspeedCz](https://crowdin.com/profile/CyberspeedCz) +* [Damian Soler](https://crowdin.com/profile/Under_RL) +* [Dan Vasiliu](https://crowdin.com/profile/dvasiliu) +* [Danil Sarvensky](https://crowdin.com/profile/sarvensky) +* [David Zheng](https://crowdin.com/profile/msdz) +* [Daya Adianto](https://crowdin.com/profile/addianto) +* [Deadbringer](https://crowdin.com/profile/Deadbringer) +* [DmJacky](https://crowdin.com/profile/DmJacky) +* [Dmytro](https://crowdin.com/profile/LinkinWires) +* [Droidman](https://crowdin.com/profile/Droidman) +* [Dániel P.](https://crowdin.com/profile/Daniii_) +* [EDNVKjldr8vyu9](https://crowdin.com/profile/EDNVKjldr8vyu9) +* [EMRE ÇELİK](https://crowdin.com/profile/emre0447) +* [Ege Esin](https://crowdin.com/profile/ege_e) +* [Emanuel Messias, R.d.S.](https://crowdin.com/profile/MessiasOF) +* [Enrique Castillo](https://crowdin.com/profile/ecastillo) +* [Eryk Pazoła](https://crowdin.com/profile/erykpaz2004) +* [Fire KM127PL](https://crowdin.com/profile/KM127PL) +* [Francesco Maria Poerio](https://crowdin.com/profile/fracchiomon) +* [Frederico Maia](https://crowdin.com/profile/omaster) +* [Gabriele Arena](https://crowdin.com/profile/teamexpert2013) +* [Gol D. Ace](https://crowdin.com/profile/goldace) +* [Guillaume Turchini](https://crowdin.com/profile/orion78fr) +* [Hackebein](https://crowdin.com/profile/Hackebein) +* [Henry Agudelo](https://crowdin.com/profile/hdagudelo) +* [HiroOnGitHub](https://crowdin.com/profile/HiroOnGithub) +* [Holger Sinn](https://crowdin.com/profile/Holger-Sinn) +* [IT_Translator](https://crowdin.com/profile/IT_Translator) +* [Itukii](https://crowdin.com/profile/Itukii) +* [Ivo Sestren Junior](https://crowdin.com/profile/IvoSestren) +* [Janis Majors](https://crowdin.com/profile/bobola) +* [Jeffrey Chapuis](https://crowdin.com/profile/ashyni1987) +* [Jelmer](https://crowdin.com/profile/Luxizzle) +* [Jens Fischer](https://crowdin.com/profile/JensFZ) +* [Jessy HACHET](https://crowdin.com/profile/jessy.hachet) +* [Job Diógenes Ribeiro Borges](https://crowdin.com/profile/jobdiogenes) +* [Jonas Van den Abbeele](https://crowdin.com/profile/jonasvda2006) +* [Kevin Kandlbinder](https://crowdin.com/profile/kevink) +* [Kim Bech](https://crowdin.com/profile/kimbech) +* [Kokosnuss.exe](https://crowdin.com/profile/KokosnussDEV) +* [Krit789](https://crowdin.com/profile/Krit789) +* [Kurozumi](https://crowdin.com/profile/Kurozumi) +* [LANCERRR](https://crowdin.com/profile/dongxujiayou88) +* [LeNinjaHD](https://crowdin.com/profile/LeNinjaHD) +* [Leonardo Fries](https://crowdin.com/profile/LeoNerdinho) +* [Lifeely](https://crowdin.com/profile/Lifeely) +* [Loïc](https://crowdin.com/profile/Ozachi) +* [LucN31](https://crowdin.com/profile/LucN31) +* [Lucas Fernandez](https://crowdin.com/profile/kasey-fr) +* [Léo Roubaud](https://crowdin.com/profile/hydargos) +* [MIBAND](https://crowdin.com/profile/LEMIBANDDEXARI) +* [Maciej4535](https://crowdin.com/profile/Maciej4535) +* [Marcel Kuhla](https://crowdin.com/profile/CandyPanda) +* [Marco Túlio Pires](https://crowdin.com/profile/mtrpires) +* [Martin Hybner](https://crowdin.com/profile/hybner) +* [Mateusz Zych](https://crowdin.com/profile/soruse) +* [Michael Fabian Dirks](https://crowdin.com/profile/Xaymar) +* [Mikhail](https://crowdin.com/profile/Migelius74) +* [MkHere-YT](https://crowdin.com/profile/MkHere) +* [Mnr. Volkstaat](https://crowdin.com/profile/malapradex) +* [Monsteer](https://crowdin.com/profile/Monsteer) +* [Mr Gohst](https://crowdin.com/profile/Gohst) +* [NOYB](https://crowdin.com/profile/NOYB) +* [Nanito Morillas](https://crowdin.com/profile/hellnano) +* [Nawin Somprasong](https://crowdin.com/profile/thaipirch98) +* [Nikola Perović](https://crowdin.com/profile/Fooftilly) +* [Nobre HD](https://crowdin.com/profile/NobreHD) +* [Nooody FR](https://crowdin.com/profile/nooodyfr) +* [Orhan Elçi](https://crowdin.com/profile/orhan.elci2003) +* [Origami](https://crowdin.com/profile/Origami) +* [Peter Grindem](https://crowdin.com/profile/1pete1) +* [Proryanator](https://crowdin.com/profile/Proryanator) +* [Renaud G.](https://crowdin.com/profile/obiwankennedy) +* [RezQ](https://crowdin.com/profile/RezQ) +* [Richie Bendall](https://crowdin.com/profile/richiebendall) +* [Robin Tetour](https://crowdin.com/profile/RobTheRealLifeAnimoo) +* [Romeo Bunić](https://crowdin.com/profile/Romz) +* [SDUX1s44c](https://crowdin.com/profile/SDUX1s44c) +* [SKYQWER](https://crowdin.com/profile/mine17288) +* [SMG music display](https://crowdin.com/profile/SMGMusicDisplay) +* [Sade](https://crowdin.com/profile/Sade) +* [Sandschi](https://crowdin.com/profile/sandschi) +* [ScottInTokyo](https://crowdin.com/profile/ScottInTokyo) +* [Serhiy Dmytryshyn](https://crowdin.com/profile/dies) +* [Sjoer van der Ploeg](https://crowdin.com/profile/sfjuocekr) +* [StanislavPro](https://crowdin.com/profile/StanislavPro) +* [StarFang208](https://crowdin.com/profile/StarFang208) +* [Store](https://crowdin.com/profile/HelaBasa) +* [Syskoh](https://crowdin.com/profile/Syskoh) +* [Szymon Szewc](https://crowdin.com/profile/szymonszewcjr) +* [TOWUK](https://crowdin.com/profile/towuk) +* [ThePooN](https://crowdin.com/profile/ThePooN) +* [Thom Knepper](https://crowdin.com/profile/MrKnepp) +* [Tim Cordes](https://crowdin.com/profile/t1mc0rd35) +* [Toine Enzo](https://crowdin.com/profile/toineenzo) +* [TonyWin Somprasong](https://crowdin.com/profile/mga1627) +* [TorniX0](https://crowdin.com/profile/TorniX0) +* [Tuna](https://crowdin.com/profile/zentoryny) +* [Vane Brain](https://crowdin.com/profile/vanebrain3) +* [Viginox](https://crowdin.com/profile/Viginox) +* [WDK1337](https://crowdin.com/profile/WDK1337) +* [Wesley Pyburn (TechNobo)](https://crowdin.com/profile/TcNobo) +* [WhiteyChannel](https://crowdin.com/profile/zvd.pro) +* [WoWnik](https://crowdin.com/profile/wownik98) +* [Yoinks DBD](https://crowdin.com/profile/izzyfazt) +* [Yumis](https://crowdin.com/profile/yumis84) +* [Yurlyn](https://crowdin.com/profile/Yurlyn) +* [ZHANGEN](https://crowdin.com/profile/ZHANGEN) +* [Zero Team](https://crowdin.com/profile/ZERO_TEAM) +* [Zoop](https://crowdin.com/profile/Zoop) +* [bruh](https://crowdin.com/profile/noobumpls) +* [code.sport](https://crowdin.com/profile/code.sport) +* [erichardouin](https://crowdin.com/profile/erichardouin) +* [eskori](https://crowdin.com/profile/eskori) +* [exeldro](https://crowdin.com/profile/exeldro) +* [itsolutek](https://crowdin.com/profile/itsolutek) +* [jh KIm](https://crowdin.com/profile/kkhmn1) +* [kkk12955](https://crowdin.com/profile/kkk12955) +* [lukazivanovic](https://crowdin.com/profile/lukazivanovic) +* [mochaaP](https://crowdin.com/profile/mochaaP) +* [mudse](https://crowdin.com/profile/mudse) +* [multi.flexi](https://crowdin.com/profile/multi.flexi) +* [mwessen](https://crowdin.com/profile/sh3ph3r6) +* [ozaki](https://crowdin.com/profile/OzakIOne) +* [petro770](https://crowdin.com/profile/petro770) +* [rufus20145](https://crowdin.com/profile/rufus20145) +* [sasagar](https://crowdin.com/profile/sasagar) +* [sasha2002](https://crowdin.com/profile/sasha2002) +* [saygo1125](https://crowdin.com/profile/saygo1125) +* [shugen002](https://crowdin.com/profile/shugen002) +* [spring jungle](https://crowdin.com/profile/springjungle) +* [tpo0508](https://crowdin.com/profile/tpo0508) +* [tytan652](https://crowdin.com/profile/tytan652) +* [wwj402_github](https://crowdin.com/profile/wwj402_github) +* [xaymarsdaddy](https://crowdin.com/profile/xaymarsdaddy) +* [yuvuwj](https://crowdin.com/profile/yuvuwj) +* [Вадим Казанцев](https://crowdin.com/profile/Rutboy) +* [Вадим Якшин](https://crowdin.com/profile/tayler2013) +* [Денис Полозихин](https://crowdin.com/profile/denispolozihin) +* [Евгений Шестяков](https://crowdin.com/profile/anfogor) +* [十六夜楓](https://crowdin.com/profile/fy1208557958) +* [시공의 폭풍](https://crowdin.com/profile/parkjh030746) ## Supporters -* Anton Safronov -* Benjamin Hoffmeister -* Brett Dowling -* Creator's Alliance -* Jasper Concepcion -* Jeremy "razorlikes" Nieth -* Keridos -* MaD -* Nico Thate -* nwgat.ninja -* olemars -* QappZ -* tehMorag: [Twitch](https://twitch.tv/tehMorag) -* Steel Brain -* tryptech -* Vangardt +The StreamFX project relies on generous donations from you through [Patreon](https://patreon.com/xaymar), [GitHub](https://github.com/sponsors/xaymar) or [PayPal](https://paypal.me/xaymar). Huge thanks go out to the following people for supporting StreamFX: -## Translators -* Alex E. D. B. -* Chris BDS -* Dileytro -* Eryk Pazola -* Gol D. Ace -* Jessy Hachet -* Loïc -* Noi -* Nooody FR -* SMG music display -* StanislavPro -* TOWUK -* Vainock: [Crowdin](https://crowdin.com/profile/ivo.lemmert) -* Vane Brain -* WhiteyChannel -* WoWnik: [Website](https://wownik.ru), [Twitch](https://www.twitch.tv/wownik), [VK](https://vk.com/wownik) -* wwj402 -* Yoinks DBD -* Yurlyn -* Лука Живановић +### GitHub Sponsors +* [DJNOCTUS](https://github.com/DJNOCTUS) +* [FateOfNines](https://github.com/FateOfNines) +* [GranDroidTonight](https://github.com/GranDroidTonight) +* [Harmansingh1397](https://github.com/Harmansingh1397) +* [Hugo Denizart](https://github.com/ThePooN) +* [Joe Kluch](https://github.com/jkluch) +* [Joefis-x20s](https://github.com/Joefis-x20s) +* [LagaV](https://github.com/LagaV) +* [M*C*O](https://github.com/MCOfficer) +* [MEKKER](https://github.com/MEKKERMB) +* [Maxwell Bloch](https://github.com/maxwellb) +* [Noora](https://github.com/noorus) +* [Pabloss1987](https://github.com/Pabloss1987) +* [Raidenex](https://github.com/Raidenex) +* [Stealthlips](https://github.com/Stealthlips) +* [TheB1gG](https://github.com/TheB1gG) +* [Tim](https://github.com/elricco) +* [Travis Crawford](https://github.com/traviscrawford85) +* [VensireStudios](https://github.com/VensireStudios) +* [blackmoon1910](https://github.com/blackmoon1910) +* [jTRN2x0](https://github.com/jTRN2x0) +* [kevinfrogernl](https://github.com/kevinfrogernl) +* [mbWebsolution](https://github.com/mbWebsolution) +* [oshiteku](https://github.com/oshiteku) +* [pirahtays](https://github.com/pirahtays) +* [wild-wild-fibsh](https://github.com/wild-wild-fibsh) -# Generating this file -1. git log --pretty=format:'%aN <%aE>' | sort -u -2. Merge entries by e-Mail +### Patreon Patrons +* [Aaron ](https://www.patreon.com/user/creators?u=22565926) +* [Abs](https://www.patreon.com/user/creators?u=63196404) +* [Adam Dangerbeard](https://www.patreon.com/user/creators?u=5048919) +* [Adel Toay](https://www.patreon.com/user/creators?u=58184164) +* [Alexandre Cyr](https://www.patreon.com/user/creators?u=8576328) +* [And We're Live! PreZZure](https://www.patreon.com/user/creators?u=49966803) +* [Bastian Koyro](https://www.patreon.com/user/creators?u=5086308) +* [Ben Vosburgh](https://www.patreon.com/user/creators?u=4062691) +* [Benjamin Hoffmeister](https://www.patreon.com/user/creators?u=5087057) +* [Bjarke Kongstad](https://www.patreon.com/user/creators?u=10147732) +* [Brownie ](https://www.patreon.com/user/creators?u=29687375) +* [Brutus Shearer](https://www.patreon.com/user/creators?u=53110694) +* [Chris Lynch](https://www.patreon.com/user/creators?u=3921522) +* [Cory Goodwin](https://www.patreon.com/user/creators?u=58410833) +* [Craft Computing](https://www.patreon.com/user/creators?u=7422105) +* [Ct84FUASk5bFstq](https://www.patreon.com/user/creators?u=41874925) +* [D_Girl ](https://www.patreon.com/user/creators?u=3625413) +* [David Bixler](https://www.patreon.com/user/creators?u=5429239) +* [David Do](https://www.patreon.com/user/creators?u=32255073) +* [Dean Barclay](https://www.patreon.com/user/creators?u=9449350) +* [DrunKev ](https://www.patreon.com/user/creators?u=26063390) +* [Dustin Deatherage](https://www.patreon.com/user/creators?u=63380532) +* [Ebony Zinnack](https://www.patreon.com/user/creators?u=31612990) +* [EmeraIdCola ](https://www.patreon.com/user/creators?u=27503685) +* [Eric Dieter Hesselbach](https://www.patreon.com/user/creators?u=35660482) +* [Formica](https://www.patreon.com/user/creators?u=2442057) +* [Gary Griffith](https://www.patreon.com/user/creators?u=49564527) +* [Gimli Son Of Gloin](https://www.patreon.com/user/creators?u=34065035) +* [Gronkh ](https://www.patreon.com/user/creators?u=2617905) +* [Hana Pestle](https://www.patreon.com/user/creators?u=33587406) +* [How to Drink](https://www.patreon.com/user/creators?u=6391455) +* [Héctor Rivera](https://www.patreon.com/user/creators?u=20884936) +* [JeffCraig ](https://www.patreon.com/user/creators?u=3214093) +* [Jerod Bennett](https://www.patreon.com/user/creators?u=471437) +* [Joe Dougherty](https://www.patreon.com/user/creators?u=929557) +* [Jon Petermann](https://www.patreon.com/user/creators?u=63931570) +* [Jonathan Gilligan](https://www.patreon.com/user/creators?u=16212519) +* [Jonathan Perkins](https://www.patreon.com/user/creators?u=35345012) +* [Joseph Estes](https://www.patreon.com/user/creators?u=31240177) +* [Juncker ](https://www.patreon.com/user/creators?u=25351345) +* [Justin Ruiz](https://www.patreon.com/user/creators?u=61134357) +* [Kei Foster](https://www.patreon.com/user/creators?u=3252261) +* [Kim Bech](https://www.patreon.com/user/creators?u=4473266) +* [KrisCheetah ](https://www.patreon.com/user/creators?u=5208869) +* [Lash LaRue](https://www.patreon.com/user/creators?u=27497287) +* [Manus O'Donnell](https://www.patreon.com/user/creators?u=10969884) +* [Martin Wimpress](https://www.patreon.com/user/creators?u=2780761) +* [Matt Calabrese](https://www.patreon.com/user/creators?u=2410405) +* [Michael Haßfurther](https://www.patreon.com/user/creators?u=54198386) +* [Mikaykaybooboo](https://www.patreon.com/user/creators?u=55606570) +* [Mike King](https://www.patreon.com/user/creators?u=2824850) +* [MrLiveProducer](https://www.patreon.com/user/creators?u=283535) +* [MyNameIsJeff ](https://www.patreon.com/user/creators?u=26176738) +* [Neil Gaddie](https://www.patreon.com/user/creators?u=53600538) +* [Nik Wright](https://www.patreon.com/user/creators?u=64748110) +* [Noah](https://www.patreon.com/user/creators?u=28561459) +* [Nordern ](https://www.patreon.com/user/creators?u=6970809) +* [Owen Quinlan](https://www.patreon.com/user/creators?u=25383903) +* [Pascal Jean](https://www.patreon.com/user/creators?u=59781622) +* [Peter Donaghy](https://www.patreon.com/user/creators?u=50612254) +* [Peter van Kalleveen](https://www.patreon.com/user/creators?u=59122352) +* [Raiden](https://www.patreon.com/user/creators?u=9645671) +* [Roman Jacob Concordia](https://www.patreon.com/user/creators?u=58076170) +* [Ryan Hopkins](https://www.patreon.com/user/creators?u=3819264) +* [SadeN.moe ](https://www.patreon.com/user/creators?u=8930949) +* [Sean ](https://www.patreon.com/user/creators?u=2382106) +* [Sean Willeboordse](https://www.patreon.com/user/creators?u=9419328) +* [Shadowy](https://www.patreon.com/user/creators?u=23349012) +* [SigmaH20 .](https://www.patreon.com/user/creators?u=34295895) +* [Simon Vacker](https://www.patreon.com/user/creators?u=516915) +* [StealthCT ](https://www.patreon.com/user/creators?u=5055600) +* [UpDownLeftDie ](https://www.patreon.com/user/creators?u=13992640) +* [Zep Brattesani](https://www.patreon.com/user/creators?u=915823) +* [asdkola](https://www.patreon.com/user/creators?u=49505113) +* [blyt](https://www.patreon.com/user/creators?u=47035760) +* [hikaruXwiiwalker](https://www.patreon.com/user/creators?u=152960) +* [iamresist ](https://www.patreon.com/user/creators?u=19164596) +* [norlife ](https://www.patreon.com/user/creators?u=11953551) +* [ragesaq](https://www.patreon.com/user/creators?u=34519727) +* [reelmccoy ](https://www.patreon.com/user/creators?u=2454633) +* [sid sawyer](https://www.patreon.com/user/creators?u=34103367) +* [trus0und](https://www.patreon.com/user/creators?u=43845831) +* [tsukasa](https://www.patreon.com/user/creators?u=23383875) +* [zachary harrisson](https://www.patreon.com/user/creators?u=61387322) -## Note -Manually generated on 2019-04-15 by Michael Fabian 'Xaymar' Dirks. diff --git a/data/thanks.json b/data/thanks.json new file mode 100644 index 00000000..8edf0855 --- /dev/null +++ b/data/thanks.json @@ -0,0 +1,298 @@ +{ + "contributor": { + "Brandon Edens": "https://github.com/undefined/graphs/contributors", + "Carlos Baraza": "https://github.com/undefined/graphs/contributors", + "Cat Stevens": "https://github.com/undefined/graphs/contributors", + "Charles Fettinger": "https://github.com/undefined/graphs/contributors", + "Christopher P Yarger": "https://github.com/undefined/graphs/contributors", + "Daniel Hodgson": "https://github.com/undefined/graphs/contributors", + "Daniel Molkentin": "https://github.com/undefined/graphs/contributors", + "Michael Fabian 'Xaymar' Dirks": "https://github.com/undefined/graphs/contributors", + "Radegast-FFXIV": "https://github.com/undefined/graphs/contributors", + "Robert Moggach": "https://github.com/undefined/graphs/contributors", + "Vainock": "https://github.com/undefined/graphs/contributors", + "William Pettersson": "https://github.com/undefined/graphs/contributors", + "coolsoft.rf": "https://github.com/undefined/graphs/contributors", + "kilin": "https://github.com/undefined/graphs/contributors", + "tytan652": "https://github.com/undefined/graphs/contributors", + "wwj402": "https://github.com/undefined/graphs/contributors" + }, + "translator": { + "A Ismaili": "https://crowdin.com/profile/achimismaili", + "Adolfo Jayme": "https://crowdin.com/profile/fitoschido", + "Alex E. D. B.": "https://crowdin.com/profile/alexedb", + "Alexander Haffer": "https://crowdin.com/profile/AlexanderHaffer", + "AmirGhorbani_ir": "https://crowdin.com/profile/AmirGhorbani_ir", + "Arcan Yiğit Taşkan": "https://crowdin.com/profile/karamizahim", + "Artem": "https://crowdin.com/profile/Artem4ik", + "Arthur": "https://crowdin.com/profile/Skor_X", + "Aurora Robb Kristiansen": "https://crowdin.com/profile/Ridge", + "Billy_la_menace": "https://crowdin.com/profile/Symor", + "Boris Grigorov": "https://crowdin.com/profile/boris.grigorov26", + "Bruno Pinho": "https://crowdin.com/profile/BPinho", + "Byunghun An": "https://crowdin.com/profile/kloydhere", + "Cerbion": "https://crowdin.com/profile/Cerbion", + "Chris BDS": "https://crowdin.com/profile/HakuKaze", + "Claudio Alvez": "https://crowdin.com/profile/claudiogodofwar37", + "Claudio Nunes": "https://crowdin.com/profile/_claudionunes_", + "ColdusT": "https://crowdin.com/profile/ColdusT", + "CyberspeedCz": "https://crowdin.com/profile/CyberspeedCz", + "Damian Soler": "https://crowdin.com/profile/Under_RL", + "Dan Vasiliu": "https://crowdin.com/profile/dvasiliu", + "Danil Sarvensky": "https://crowdin.com/profile/sarvensky", + "David Zheng": "https://crowdin.com/profile/msdz", + "Daya Adianto": "https://crowdin.com/profile/addianto", + "Deadbringer": "https://crowdin.com/profile/Deadbringer", + "DmJacky": "https://crowdin.com/profile/DmJacky", + "Dmytro": "https://crowdin.com/profile/LinkinWires", + "Droidman": "https://crowdin.com/profile/Droidman", + "Dániel P.": "https://crowdin.com/profile/Daniii_", + "EDNVKjldr8vyu9": "https://crowdin.com/profile/EDNVKjldr8vyu9", + "EMRE ÇELİK": "https://crowdin.com/profile/emre0447", + "Ege Esin": "https://crowdin.com/profile/ege_e", + "Emanuel Messias, R.d.S.": "https://crowdin.com/profile/MessiasOF", + "Enrique Castillo": "https://crowdin.com/profile/ecastillo", + "Eryk Pazoła": "https://crowdin.com/profile/erykpaz2004", + "Fire KM127PL": "https://crowdin.com/profile/KM127PL", + "Francesco Maria Poerio": "https://crowdin.com/profile/fracchiomon", + "Frederico Maia": "https://crowdin.com/profile/omaster", + "Gabriele Arena": "https://crowdin.com/profile/teamexpert2013", + "Gol D. Ace": "https://crowdin.com/profile/goldace", + "Guillaume Turchini": "https://crowdin.com/profile/orion78fr", + "Hackebein": "https://crowdin.com/profile/Hackebein", + "Henry Agudelo": "https://crowdin.com/profile/hdagudelo", + "HiroOnGitHub": "https://crowdin.com/profile/HiroOnGithub", + "Holger Sinn": "https://crowdin.com/profile/Holger-Sinn", + "IT_Translator": "https://crowdin.com/profile/IT_Translator", + "Itukii": "https://crowdin.com/profile/Itukii", + "Ivo Sestren Junior": "https://crowdin.com/profile/IvoSestren", + "Janis Majors": "https://crowdin.com/profile/bobola", + "Jeffrey Chapuis": "https://crowdin.com/profile/ashyni1987", + "Jelmer": "https://crowdin.com/profile/Luxizzle", + "Jens Fischer": "https://crowdin.com/profile/JensFZ", + "Jessy HACHET": "https://crowdin.com/profile/jessy.hachet", + "Job Diógenes Ribeiro Borges": "https://crowdin.com/profile/jobdiogenes", + "Jonas Van den Abbeele": "https://crowdin.com/profile/jonasvda2006", + "Kevin Kandlbinder": "https://crowdin.com/profile/kevink", + "Kim Bech": "https://crowdin.com/profile/kimbech", + "Kokosnuss.exe": "https://crowdin.com/profile/KokosnussDEV", + "Krit789": "https://crowdin.com/profile/Krit789", + "Kurozumi": "https://crowdin.com/profile/Kurozumi", + "LANCERRR": "https://crowdin.com/profile/dongxujiayou88", + "LeNinjaHD": "https://crowdin.com/profile/LeNinjaHD", + "Leonardo Fries": "https://crowdin.com/profile/LeoNerdinho", + "Lifeely": "https://crowdin.com/profile/Lifeely", + "Loïc": "https://crowdin.com/profile/Ozachi", + "LucN31": "https://crowdin.com/profile/LucN31", + "Lucas Fernandez": "https://crowdin.com/profile/kasey-fr", + "Léo Roubaud": "https://crowdin.com/profile/hydargos", + "MIBAND": "https://crowdin.com/profile/LEMIBANDDEXARI", + "Maciej4535": "https://crowdin.com/profile/Maciej4535", + "Marcel Kuhla": "https://crowdin.com/profile/CandyPanda", + "Marco Túlio Pires": "https://crowdin.com/profile/mtrpires", + "Martin Hybner": "https://crowdin.com/profile/hybner", + "Mateusz Zych": "https://crowdin.com/profile/soruse", + "Michael Fabian Dirks": "https://crowdin.com/profile/Xaymar", + "Mikhail": "https://crowdin.com/profile/Migelius74", + "MkHere-YT": "https://crowdin.com/profile/MkHere", + "Mnr. Volkstaat": "https://crowdin.com/profile/malapradex", + "Monsteer": "https://crowdin.com/profile/Monsteer", + "Mr Gohst": "https://crowdin.com/profile/Gohst", + "NOYB": "https://crowdin.com/profile/NOYB", + "Nanito Morillas": "https://crowdin.com/profile/hellnano", + "Nawin Somprasong": "https://crowdin.com/profile/thaipirch98", + "Nikola Perović": "https://crowdin.com/profile/Fooftilly", + "Nobre HD": "https://crowdin.com/profile/NobreHD", + "Nooody FR": "https://crowdin.com/profile/nooodyfr", + "Orhan Elçi": "https://crowdin.com/profile/orhan.elci2003", + "Origami": "https://crowdin.com/profile/Origami", + "Peter Grindem": "https://crowdin.com/profile/1pete1", + "Proryanator": "https://crowdin.com/profile/Proryanator", + "Renaud G.": "https://crowdin.com/profile/obiwankennedy", + "RezQ": "https://crowdin.com/profile/RezQ", + "Richie Bendall": "https://crowdin.com/profile/richiebendall", + "Robin Tetour": "https://crowdin.com/profile/RobTheRealLifeAnimoo", + "Romeo Bunić": "https://crowdin.com/profile/Romz", + "SDUX1s44c": "https://crowdin.com/profile/SDUX1s44c", + "SKYQWER": "https://crowdin.com/profile/mine17288", + "SMG music display": "https://crowdin.com/profile/SMGMusicDisplay", + "Sade": "https://crowdin.com/profile/Sade", + "Sandschi": "https://crowdin.com/profile/sandschi", + "ScottInTokyo": "https://crowdin.com/profile/ScottInTokyo", + "Serhiy Dmytryshyn": "https://crowdin.com/profile/dies", + "Sjoer van der Ploeg": "https://crowdin.com/profile/sfjuocekr", + "StanislavPro": "https://crowdin.com/profile/StanislavPro", + "StarFang208": "https://crowdin.com/profile/StarFang208", + "Store": "https://crowdin.com/profile/HelaBasa", + "Syskoh": "https://crowdin.com/profile/Syskoh", + "Szymon Szewc": "https://crowdin.com/profile/szymonszewcjr", + "TOWUK": "https://crowdin.com/profile/towuk", + "ThePooN": "https://crowdin.com/profile/ThePooN", + "Thom Knepper": "https://crowdin.com/profile/MrKnepp", + "Tim Cordes": "https://crowdin.com/profile/t1mc0rd35", + "Toine Enzo": "https://crowdin.com/profile/toineenzo", + "TonyWin Somprasong": "https://crowdin.com/profile/mga1627", + "TorniX0": "https://crowdin.com/profile/TorniX0", + "Tuna": "https://crowdin.com/profile/zentoryny", + "Vane Brain": "https://crowdin.com/profile/vanebrain3", + "Viginox": "https://crowdin.com/profile/Viginox", + "WDK1337": "https://crowdin.com/profile/WDK1337", + "Wesley Pyburn (TechNobo)": "https://crowdin.com/profile/TcNobo", + "WhiteyChannel": "https://crowdin.com/profile/zvd.pro", + "WoWnik": "https://crowdin.com/profile/wownik98", + "Yoinks DBD": "https://crowdin.com/profile/izzyfazt", + "Yumis": "https://crowdin.com/profile/yumis84", + "Yurlyn": "https://crowdin.com/profile/Yurlyn", + "ZHANGEN": "https://crowdin.com/profile/ZHANGEN", + "Zero Team": "https://crowdin.com/profile/ZERO_TEAM", + "Zoop": "https://crowdin.com/profile/Zoop", + "bruh": "https://crowdin.com/profile/noobumpls", + "code.sport": "https://crowdin.com/profile/code.sport", + "erichardouin": "https://crowdin.com/profile/erichardouin", + "eskori": "https://crowdin.com/profile/eskori", + "exeldro": "https://crowdin.com/profile/exeldro", + "itsolutek": "https://crowdin.com/profile/itsolutek", + "jh KIm": "https://crowdin.com/profile/kkhmn1", + "kkk12955": "https://crowdin.com/profile/kkk12955", + "lukazivanovic": "https://crowdin.com/profile/lukazivanovic", + "mochaaP": "https://crowdin.com/profile/mochaaP", + "mudse": "https://crowdin.com/profile/mudse", + "multi.flexi": "https://crowdin.com/profile/multi.flexi", + "mwessen": "https://crowdin.com/profile/sh3ph3r6", + "ozaki": "https://crowdin.com/profile/OzakIOne", + "petro770": "https://crowdin.com/profile/petro770", + "rufus20145": "https://crowdin.com/profile/rufus20145", + "sasagar": "https://crowdin.com/profile/sasagar", + "sasha2002": "https://crowdin.com/profile/sasha2002", + "saygo1125": "https://crowdin.com/profile/saygo1125", + "shugen002": "https://crowdin.com/profile/shugen002", + "spring jungle": "https://crowdin.com/profile/springjungle", + "tpo0508": "https://crowdin.com/profile/tpo0508", + "tytan652": "https://crowdin.com/profile/tytan652", + "wwj402_github": "https://crowdin.com/profile/wwj402_github", + "xaymarsdaddy": "https://crowdin.com/profile/xaymarsdaddy", + "yuvuwj": "https://crowdin.com/profile/yuvuwj", + "Вадим Казанцев": "https://crowdin.com/profile/Rutboy", + "Вадим Якшин": "https://crowdin.com/profile/tayler2013", + "Денис Полозихин": "https://crowdin.com/profile/denispolozihin", + "Евгений Шестяков": "https://crowdin.com/profile/anfogor", + "十六夜楓": "https://crowdin.com/profile/fy1208557958", + "시공의 폭풍": "https://crowdin.com/profile/parkjh030746" + }, + "supporter": { + "github": { + "DJNOCTUS": "https://github.com/DJNOCTUS", + "FateOfNines": "https://github.com/FateOfNines", + "GranDroidTonight": "https://github.com/GranDroidTonight", + "Harmansingh1397": "https://github.com/Harmansingh1397", + "Hugo Denizart": "https://github.com/ThePooN", + "Joe Kluch": "https://github.com/jkluch", + "Joefis-x20s": "https://github.com/Joefis-x20s", + "LagaV": "https://github.com/LagaV", + "M*C*O": "https://github.com/MCOfficer", + "MEKKER": "https://github.com/MEKKERMB", + "Maxwell Bloch": "https://github.com/maxwellb", + "Noora": "https://github.com/noorus", + "Pabloss1987": "https://github.com/Pabloss1987", + "Raidenex": "https://github.com/Raidenex", + "Stealthlips": "https://github.com/Stealthlips", + "TheB1gG": "https://github.com/TheB1gG", + "Tim": "https://github.com/elricco", + "Travis Crawford": "https://github.com/traviscrawford85", + "VensireStudios": "https://github.com/VensireStudios", + "blackmoon1910": "https://github.com/blackmoon1910", + "jTRN2x0": "https://github.com/jTRN2x0", + "kevinfrogernl": "https://github.com/kevinfrogernl", + "mbWebsolution": "https://github.com/mbWebsolution", + "oshiteku": "https://github.com/oshiteku", + "pirahtays": "https://github.com/pirahtays", + "wild-wild-fibsh": "https://github.com/wild-wild-fibsh" + }, + "patreon": { + "Aaron ": "https://www.patreon.com/user/creators?u=22565926", + "Abs": "https://www.patreon.com/user/creators?u=63196404", + "Adam Dangerbeard": "https://www.patreon.com/user/creators?u=5048919", + "Adel Toay": "https://www.patreon.com/user/creators?u=58184164", + "Alexandre Cyr": "https://www.patreon.com/user/creators?u=8576328", + "And We're Live! PreZZure": "https://www.patreon.com/user/creators?u=49966803", + "Bastian Koyro": "https://www.patreon.com/user/creators?u=5086308", + "Ben Vosburgh": "https://www.patreon.com/user/creators?u=4062691", + "Benjamin Hoffmeister": "https://www.patreon.com/user/creators?u=5087057", + "Bjarke Kongstad": "https://www.patreon.com/user/creators?u=10147732", + "Brownie ": "https://www.patreon.com/user/creators?u=29687375", + "Brutus Shearer": "https://www.patreon.com/user/creators?u=53110694", + "Chris Lynch": "https://www.patreon.com/user/creators?u=3921522", + "Cory Goodwin": "https://www.patreon.com/user/creators?u=58410833", + "Craft Computing": "https://www.patreon.com/user/creators?u=7422105", + "Ct84FUASk5bFstq": "https://www.patreon.com/user/creators?u=41874925", + "D_Girl ": "https://www.patreon.com/user/creators?u=3625413", + "David Bixler": "https://www.patreon.com/user/creators?u=5429239", + "David Do": "https://www.patreon.com/user/creators?u=32255073", + "Dean Barclay": "https://www.patreon.com/user/creators?u=9449350", + "DrunKev ": "https://www.patreon.com/user/creators?u=26063390", + "Dustin Deatherage": "https://www.patreon.com/user/creators?u=63380532", + "Ebony Zinnack": "https://www.patreon.com/user/creators?u=31612990", + "EmeraIdCola ": "https://www.patreon.com/user/creators?u=27503685", + "Eric Dieter Hesselbach": "https://www.patreon.com/user/creators?u=35660482", + "Formica": "https://www.patreon.com/user/creators?u=2442057", + "Gary Griffith": "https://www.patreon.com/user/creators?u=49564527", + "Gimli Son Of Gloin": "https://www.patreon.com/user/creators?u=34065035", + "Gronkh ": "https://www.patreon.com/user/creators?u=2617905", + "Hana Pestle": "https://www.patreon.com/user/creators?u=33587406", + "How to Drink": "https://www.patreon.com/user/creators?u=6391455", + "Héctor Rivera": "https://www.patreon.com/user/creators?u=20884936", + "JeffCraig ": "https://www.patreon.com/user/creators?u=3214093", + "Jerod Bennett": "https://www.patreon.com/user/creators?u=471437", + "Joe Dougherty": "https://www.patreon.com/user/creators?u=929557", + "Jon Petermann": "https://www.patreon.com/user/creators?u=63931570", + "Jonathan Gilligan": "https://www.patreon.com/user/creators?u=16212519", + "Jonathan Perkins": "https://www.patreon.com/user/creators?u=35345012", + "Joseph Estes": "https://www.patreon.com/user/creators?u=31240177", + "Juncker ": "https://www.patreon.com/user/creators?u=25351345", + "Justin Ruiz": "https://www.patreon.com/user/creators?u=61134357", + "Kei Foster": "https://www.patreon.com/user/creators?u=3252261", + "Kim Bech": "https://www.patreon.com/user/creators?u=4473266", + "KrisCheetah ": "https://www.patreon.com/user/creators?u=5208869", + "Lash LaRue": "https://www.patreon.com/user/creators?u=27497287", + "Manus O'Donnell": "https://www.patreon.com/user/creators?u=10969884", + "Martin Wimpress": "https://www.patreon.com/user/creators?u=2780761", + "Matt Calabrese": "https://www.patreon.com/user/creators?u=2410405", + "Michael Haßfurther": "https://www.patreon.com/user/creators?u=54198386", + "Mikaykaybooboo": "https://www.patreon.com/user/creators?u=55606570", + "Mike King": "https://www.patreon.com/user/creators?u=2824850", + "MrLiveProducer": "https://www.patreon.com/user/creators?u=283535", + "MyNameIsJeff ": "https://www.patreon.com/user/creators?u=26176738", + "Neil Gaddie": "https://www.patreon.com/user/creators?u=53600538", + "Nik Wright": "https://www.patreon.com/user/creators?u=64748110", + "Noah": "https://www.patreon.com/user/creators?u=28561459", + "Nordern ": "https://www.patreon.com/user/creators?u=6970809", + "Owen Quinlan": "https://www.patreon.com/user/creators?u=25383903", + "Pascal Jean": "https://www.patreon.com/user/creators?u=59781622", + "Peter Donaghy": "https://www.patreon.com/user/creators?u=50612254", + "Peter van Kalleveen": "https://www.patreon.com/user/creators?u=59122352", + "Raiden": "https://www.patreon.com/user/creators?u=9645671", + "Roman Jacob Concordia": "https://www.patreon.com/user/creators?u=58076170", + "Ryan Hopkins": "https://www.patreon.com/user/creators?u=3819264", + "SadeN.moe ": "https://www.patreon.com/user/creators?u=8930949", + "Sean ": "https://www.patreon.com/user/creators?u=2382106", + "Sean Willeboordse": "https://www.patreon.com/user/creators?u=9419328", + "Shadowy": "https://www.patreon.com/user/creators?u=23349012", + "SigmaH20 .": "https://www.patreon.com/user/creators?u=34295895", + "Simon Vacker": "https://www.patreon.com/user/creators?u=516915", + "StealthCT ": "https://www.patreon.com/user/creators?u=5055600", + "UpDownLeftDie ": "https://www.patreon.com/user/creators?u=13992640", + "Zep Brattesani": "https://www.patreon.com/user/creators?u=915823", + "asdkola": "https://www.patreon.com/user/creators?u=49505113", + "blyt": "https://www.patreon.com/user/creators?u=47035760", + "hikaruXwiiwalker": "https://www.patreon.com/user/creators?u=152960", + "iamresist ": "https://www.patreon.com/user/creators?u=19164596", + "norlife ": "https://www.patreon.com/user/creators?u=11953551", + "ragesaq": "https://www.patreon.com/user/creators?u=34519727", + "reelmccoy ": "https://www.patreon.com/user/creators?u=2454633", + "sid sawyer": "https://www.patreon.com/user/creators?u=34103367", + "trus0und": "https://www.patreon.com/user/creators?u=43845831", + "tsukasa": "https://www.patreon.com/user/creators?u=23383875", + "zachary harrisson": "https://www.patreon.com/user/creators?u=61387322" + } + } +} \ No newline at end of file diff --git a/tools/.gitignore b/tools/.gitignore new file mode 100644 index 00000000..07e6e472 --- /dev/null +++ b/tools/.gitignore @@ -0,0 +1 @@ +/node_modules diff --git a/tools/convert-patreon-csv.js b/tools/convert-patreon-csv.js new file mode 100644 index 00000000..a7e758bb --- /dev/null +++ b/tools/convert-patreon-csv.js @@ -0,0 +1,30 @@ +const PATH = require("path"); +const FS = require("fs/promises"); +const CSV = require("csv"); + +(async () => { + const parser = CSV.parse( + await FS.readFile(process.argv[2]), + { + columns: true + } + ); + + let unsorted_users = {}; + for await(const record of parser) { + unsorted_users[record['Name']] = `https://www.patreon.com/user/creators?u=${record['User ID']}`; + } + let users = {}; + let keys = Object.keys(unsorted_users); + for (let key of keys.sort()) { + users[key] = unsorted_users[key]; + } + + FS.writeFile( + PATH.join(__dirname, "patch-supporters-patreon.json"), + JSON.stringify(users, undefined, '\t'), + { + encoding: 'utf8' + } + ); +})(); diff --git a/tools/generate-contributors.js b/tools/generate-contributors.js new file mode 100644 index 00000000..64249581 --- /dev/null +++ b/tools/generate-contributors.js @@ -0,0 +1,329 @@ +const HTTPS = require("https"); +const PATH = require("path"); +const FS = require("fs/promises"); +const CHILD_PROCESS = require("child_process"); + +function query_git() { + // git shortlog -sn --all | sed -E "s/^\W+[0-9]+\W+//" + return (async () => { + let users = new Map(); + + let git = new Promise((resolve, reject) => { + try { + const child = CHILD_PROCESS.spawn('git', ['shortlog', '-sn', '--all']); + + let sout = ""; + child.stdout.setEncoding('utf8'); + child.stdout.on('data', (data) => { + sout += data; + }); + + let serr = ""; + child.stderr.setEncoding('utf8'); + child.stderr.on('data', (data) => { + serr += data; + }); + + child.on('close', (code) => { + if (code != 0) { + reject([code, serr]); + } else { + resolve(sout); + } + }); + } catch (e) { + reject(e); + } + }); + + let result = await git; + let lines = result.matchAll(/^[\s]+([0-9]+)[\s]+(.+)$/gim); + for (let line of lines) { + let name = line[2]; + if (!users.has(name)) { + users.set(name, `https://github.com/${process.env.GITHUB_REPOSITORY}/graphs/contributors`) + } + } + + return users; + })(); +} + +function query_crowdin(project_id, project_auth_key) { + const limit = 100; + function _query_page(page) { + return new Promise((resolve, reject) => { + try { + let query = { + protocol: "https:", + host: "crowdin.com", + path: `/api/v2/projects/${project_id}/members?limit=${limit}&offset=${page * limit}`, + method: "GET", + headers: { + "accept": "application/json", + "authorization": `Bearer ${project_auth_key}` + } + }; + let req = HTTPS.request(query, (res) => { + let data = ""; + res.setEncoding('utf8'); + res.on('data', (chunk) => { + data += chunk; + }); + res.on('end', () => { + res.data = data; + resolve(res); + }); + }); + req.end(); + } catch (e) { + reject(e); + } + }); + } + + return (async () => { + let page_is_last = false; + let page = 0; + + let users = new Map(); + + while (!page_is_last) { + let res = await _query_page(page++); + if (res.statusCode == 200) { + let json = JSON.parse(res.data); + let count = json.data.length; + for (let user of json.data) { + // Don't credit blocked users for work not done. + if (user.data.role == 'blocked') { + continue; + } + + let key = (user.data.fullName !== null) && (user.data.fullName !== undefined) && (user.data.fullName.length > 0) ? user.data.fullName : user.data.username; + + users.set(key, `https://crowdin.com/profile/${user.data.username}`); + } + + page_is_last = (count < limit); + } else { + throw new Error(JSON.parse(res.data)); + } + } + + return users; + })(); +} + +function query_github_sponsors(auth_token) { + const HTTPS = require("https"); + + let build_query = function (cursor) { + if (cursor === undefined) { + return `query { + viewer { + sponsors(after: null, first: 0) { + totalCount + } + } +}`; + } else { + return `query { + viewer { + sponsors(after: ${typeof (cursor) == "string" ? `"${cursor}"` : "null"}, first: 100) { + nodes { + __typename + ... on User { + resourcePath + login + name + } + ... on Organization { + resourcePath + login + name + } + } + pageInfo { + endCursor + startCursor + } + } + } +}`; + } + } + + let do_query = function (schema) { + return new Promise((resolve, reject) => { + let text_query = JSON.stringify({ query: schema }); + + let request = HTTPS.request( + "https://api.github.com/graphql", + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': `bearer ${auth_token}`, + 'User-Agent': 'Node.JS' + }, + }, (res) => { + let data = ""; + res.setEncoding('utf8'); + res.on('data', (chunk) => { + data += chunk; + }); + res.on('error', () => { + reject(); + }); + res.on('end', () => { + res.data = JSON.parse(data); + resolve(res); + }); + }); + request.write(text_query); + request.end(); + }) + } + + return (async () => { + let users = new Map(); + let total = 0; + + // Find the total amount. + { + let query = build_query(); + let response = await do_query(query); + let data = response.data.data; + total = data.viewer.sponsors.totalCount; + } + + // Index by page, in 100 user increments. + let cursor = null; + for (let idx = 0, edx = total; idx < edx; idx += 100) { + let query = build_query(cursor); + let response = await do_query(query); + let data = response.data.data; + + // Insert data info Map. + for (let entry of data.viewer.sponsors.nodes) { + let name = entry.login; + if (typeof (entry.name) === "string") { + name = entry.name; + } + + users.set(name, `https://github.com${entry.resourcePath}`); + } + + // Update cursor for further queries. + cursor = data.viewer.sponsors.pageInfo.endCursor; + } + + return users; + })(); +} + +(async () => { + let json = {}; + let markdown = `# StreamFX Contributors & Supporters + +## Contributors + +`; + + // Contributors + {// - Git + markdown += `### Code, Media +Thanks go to the following people, who have either wrangled with code or wrangled with image editors while saving often in the hopes of not losing any changes: + +`; + json.contributor = {}; + let info = await query_git(); + let extra = JSON.parse(await FS.readFile(PATH.join(__dirname, "patch-contributors-git.json"))); + for (let key in extra) { + info.set(key, extra[key]); + } + for (let key of Array.from(info.keys()).sort()) { + let value = info.get(key); + json.contributor[key] = value; + markdown += `* [${key}](${value})\n`; + } + markdown += "\n"; + } + + {// - Crowdin + markdown += `### Translators +[StreamFX relies on crowd-sourced translations to be available in your language.](https://github.com/Xaymar/obs-StreamFX/issues/36) Much thanks go out to all volunteer translators who have taken some time to submit translations on Crowdin. + +`; + json.translator = {}; + let info = await query_crowdin(process.env.CROWDIN_PROJECTID, process.env.CROWDIN_TOKEN); + let extra = JSON.parse(await FS.readFile(PATH.join(__dirname, "patch-contributors-git.json"))); + for (let key in extra) { + info.set(key, extra[key]); + } + for (let key of Array.from(info.keys()).sort()) { + let value = info.get(key); + json.translator[key] = value; + markdown += `* [${key}](${value})\n`; + } + markdown += "\n"; + } + + // Supporters + markdown += `## Supporters +The StreamFX project relies on generous donations from you through [Patreon](https://patreon.com/xaymar), [GitHub](https://github.com/sponsors/xaymar) or [PayPal](https://paypal.me/xaymar). Huge thanks go out to the following people for supporting StreamFX: + +`; + json.supporter = {} + {// - GitHub + markdown += `### GitHub Sponsors +`; + json.supporter.github = {}; + let info = await query_github_sponsors(process.env.GITHUB_TOKEN); + let extra = JSON.parse(await FS.readFile(PATH.join(__dirname, "patch-supporters-github.json"))); + for (let key in extra) { + info.set(key, extra[key]); + } + for (let key of Array.from(info.keys()).sort()) { + let value = info.get(key); + json.supporter.github[key] = value; + markdown += `* [${key}](${value})\n`; + } + markdown += "\n"; + } + + {// - Patreon + // TODO: How do we OAuth without OAuth?! + markdown += `### Patreon Patrons +`; + json.supporter.patreon = {}; + let info = new Map(); + let extra = JSON.parse(await FS.readFile(PATH.join(__dirname, "patch-supporters-patreon.json"))); + for (let key in extra) { + info.set(key, extra[key]); + } + for (let key of Array.from(info.keys()).sort()) { + let value = info.get(key); + json.supporter.patreon[key] = value; + markdown += `* [${key}](${value})\n`; + } + markdown += "\n"; + } + + // Write Markdown file + FS.writeFile(process.argv[2], + markdown, + { + encoding: 'utf8' + } + ) + + // Write JSON file + FS.writeFile(process.argv[3], + JSON.stringify(json, undefined, '\t'), + { + encoding: 'utf8' + } + ) +})(); diff --git a/tools/package-lock.json b/tools/package-lock.json new file mode 100644 index 00000000..1b8e009c --- /dev/null +++ b/tools/package-lock.json @@ -0,0 +1,79 @@ +{ + "name": "tools", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "csv": "^6.0.4" + } + }, + "node_modules/csv": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/csv/-/csv-6.0.4.tgz", + "integrity": "sha512-v/7cLK2clZ0QpAc+/1Bl+IF3U7Cxn0oszck+tJmnM2dC7yYPUz5A/i3r2ARkaVpd3RcAzOgTh94ISGzyfF/7XQ==", + "dependencies": { + "csv-generate": "^4.0.3", + "csv-parse": "^5.0.3", + "csv-stringify": "^6.0.4", + "stream-transform": "^3.0.3" + }, + "engines": { + "node": ">= 0.1.90" + } + }, + "node_modules/csv-generate": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.0.3.tgz", + "integrity": "sha512-BLkPf0MkFfPGNNkqjnT16aNMMHUrbbguDE0pMPDcqrBeMoPOKw04dPl1VNQd6+j/JjmrXjQfFKgz6p3FT+bJFA==" + }, + "node_modules/csv-parse": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.0.3.tgz", + "integrity": "sha512-86R0WU4aEEF/1fPZKxP3NmDAYC4Ce1t9iFgKPZogG5Lvk4m9WZQkCEsDANktG29jppejwclTtEOzubN2ieCJqw==" + }, + "node_modules/csv-stringify": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.0.4.tgz", + "integrity": "sha512-Z3EbRQWwkOV3Qc2fQnJmfjrxRgAwH9AncnNK2jmtTvBvFjj/hESZUGm42YvTh9kMw2OOGPHQn5Yt0EbqoRtUVQ==" + }, + "node_modules/stream-transform": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.0.3.tgz", + "integrity": "sha512-LU+lJFT1/slgy9Yvgdr21D6PAxm1O7KoEWmXWwiqAHsocbF7woPF0xBXDGuqRycTV3tcrLq0zk+5LhjgCgI3KQ==" + } + }, + "dependencies": { + "csv": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/csv/-/csv-6.0.4.tgz", + "integrity": "sha512-v/7cLK2clZ0QpAc+/1Bl+IF3U7Cxn0oszck+tJmnM2dC7yYPUz5A/i3r2ARkaVpd3RcAzOgTh94ISGzyfF/7XQ==", + "requires": { + "csv-generate": "^4.0.3", + "csv-parse": "^5.0.3", + "csv-stringify": "^6.0.4", + "stream-transform": "^3.0.3" + } + }, + "csv-generate": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.0.3.tgz", + "integrity": "sha512-BLkPf0MkFfPGNNkqjnT16aNMMHUrbbguDE0pMPDcqrBeMoPOKw04dPl1VNQd6+j/JjmrXjQfFKgz6p3FT+bJFA==" + }, + "csv-parse": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.0.3.tgz", + "integrity": "sha512-86R0WU4aEEF/1fPZKxP3NmDAYC4Ce1t9iFgKPZogG5Lvk4m9WZQkCEsDANktG29jppejwclTtEOzubN2ieCJqw==" + }, + "csv-stringify": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.0.4.tgz", + "integrity": "sha512-Z3EbRQWwkOV3Qc2fQnJmfjrxRgAwH9AncnNK2jmtTvBvFjj/hESZUGm42YvTh9kMw2OOGPHQn5Yt0EbqoRtUVQ==" + }, + "stream-transform": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.0.3.tgz", + "integrity": "sha512-LU+lJFT1/slgy9Yvgdr21D6PAxm1O7KoEWmXWwiqAHsocbF7woPF0xBXDGuqRycTV3tcrLq0zk+5LhjgCgI3KQ==" + } + } +} diff --git a/tools/package.json b/tools/package.json new file mode 100644 index 00000000..d1d763f7 --- /dev/null +++ b/tools/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "csv": "^6.0.4" + } +} diff --git a/tools/patch-contributors-crowdin.json b/tools/patch-contributors-crowdin.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/tools/patch-contributors-crowdin.json @@ -0,0 +1 @@ +{} diff --git a/tools/patch-contributors-git.json b/tools/patch-contributors-git.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/tools/patch-contributors-git.json @@ -0,0 +1 @@ +{} diff --git a/tools/patch-supporters-github.json b/tools/patch-supporters-github.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/tools/patch-supporters-github.json @@ -0,0 +1 @@ +{} diff --git a/tools/patch-supporters-patreon.json b/tools/patch-supporters-patreon.json new file mode 100644 index 00000000..bcdd7061 --- /dev/null +++ b/tools/patch-supporters-patreon.json @@ -0,0 +1,86 @@ +{ + "Aaron ": "https://www.patreon.com/user/creators?u=22565926", + "Abs": "https://www.patreon.com/user/creators?u=63196404", + "Adam Dangerbeard": "https://www.patreon.com/user/creators?u=5048919", + "Adel Toay": "https://www.patreon.com/user/creators?u=58184164", + "Alexandre Cyr": "https://www.patreon.com/user/creators?u=8576328", + "And We're Live! PreZZure": "https://www.patreon.com/user/creators?u=49966803", + "Bastian Koyro": "https://www.patreon.com/user/creators?u=5086308", + "Ben Vosburgh": "https://www.patreon.com/user/creators?u=4062691", + "Benjamin Hoffmeister": "https://www.patreon.com/user/creators?u=5087057", + "Bjarke Kongstad": "https://www.patreon.com/user/creators?u=10147732", + "Brownie ": "https://www.patreon.com/user/creators?u=29687375", + "Brutus Shearer": "https://www.patreon.com/user/creators?u=53110694", + "Chris Lynch": "https://www.patreon.com/user/creators?u=3921522", + "Cory Goodwin": "https://www.patreon.com/user/creators?u=58410833", + "Craft Computing": "https://www.patreon.com/user/creators?u=7422105", + "Ct84FUASk5bFstq": "https://www.patreon.com/user/creators?u=41874925", + "D_Girl ": "https://www.patreon.com/user/creators?u=3625413", + "David Bixler": "https://www.patreon.com/user/creators?u=5429239", + "David Do": "https://www.patreon.com/user/creators?u=32255073", + "Dean Barclay": "https://www.patreon.com/user/creators?u=9449350", + "DrunKev ": "https://www.patreon.com/user/creators?u=26063390", + "Dustin Deatherage": "https://www.patreon.com/user/creators?u=63380532", + "Ebony Zinnack": "https://www.patreon.com/user/creators?u=31612990", + "EmeraIdCola ": "https://www.patreon.com/user/creators?u=27503685", + "Eric Dieter Hesselbach": "https://www.patreon.com/user/creators?u=35660482", + "Formica": "https://www.patreon.com/user/creators?u=2442057", + "Gary Griffith": "https://www.patreon.com/user/creators?u=49564527", + "Gimli Son Of Gloin": "https://www.patreon.com/user/creators?u=34065035", + "Gronkh ": "https://www.patreon.com/user/creators?u=2617905", + "Hana Pestle": "https://www.patreon.com/user/creators?u=33587406", + "How to Drink": "https://www.patreon.com/user/creators?u=6391455", + "Héctor Rivera": "https://www.patreon.com/user/creators?u=20884936", + "JeffCraig ": "https://www.patreon.com/user/creators?u=3214093", + "Jerod Bennett": "https://www.patreon.com/user/creators?u=471437", + "Joe Dougherty": "https://www.patreon.com/user/creators?u=929557", + "Jon Petermann": "https://www.patreon.com/user/creators?u=63931570", + "Jonathan Gilligan": "https://www.patreon.com/user/creators?u=16212519", + "Jonathan Perkins": "https://www.patreon.com/user/creators?u=35345012", + "Joseph Estes": "https://www.patreon.com/user/creators?u=31240177", + "Juncker ": "https://www.patreon.com/user/creators?u=25351345", + "Justin Ruiz": "https://www.patreon.com/user/creators?u=61134357", + "Kei Foster": "https://www.patreon.com/user/creators?u=3252261", + "Kim Bech": "https://www.patreon.com/user/creators?u=4473266", + "KrisCheetah ": "https://www.patreon.com/user/creators?u=5208869", + "Lash LaRue": "https://www.patreon.com/user/creators?u=27497287", + "Manus O'Donnell": "https://www.patreon.com/user/creators?u=10969884", + "Martin Wimpress": "https://www.patreon.com/user/creators?u=2780761", + "Matt Calabrese": "https://www.patreon.com/user/creators?u=2410405", + "Michael Haßfurther": "https://www.patreon.com/user/creators?u=54198386", + "Mikaykaybooboo": "https://www.patreon.com/user/creators?u=55606570", + "Mike King": "https://www.patreon.com/user/creators?u=2824850", + "MrLiveProducer": "https://www.patreon.com/user/creators?u=283535", + "MyNameIsJeff ": "https://www.patreon.com/user/creators?u=26176738", + "Neil Gaddie": "https://www.patreon.com/user/creators?u=53600538", + "Nik Wright": "https://www.patreon.com/user/creators?u=64748110", + "Noah": "https://www.patreon.com/user/creators?u=28561459", + "Nordern ": "https://www.patreon.com/user/creators?u=6970809", + "Owen Quinlan": "https://www.patreon.com/user/creators?u=25383903", + "Pascal Jean": "https://www.patreon.com/user/creators?u=59781622", + "Peter Donaghy": "https://www.patreon.com/user/creators?u=50612254", + "Peter van Kalleveen": "https://www.patreon.com/user/creators?u=59122352", + "Raiden": "https://www.patreon.com/user/creators?u=9645671", + "Roman Jacob Concordia": "https://www.patreon.com/user/creators?u=58076170", + "Ryan Hopkins": "https://www.patreon.com/user/creators?u=3819264", + "SadeN.moe ": "https://www.patreon.com/user/creators?u=8930949", + "Sean ": "https://www.patreon.com/user/creators?u=2382106", + "Sean Willeboordse": "https://www.patreon.com/user/creators?u=9419328", + "Shadowy": "https://www.patreon.com/user/creators?u=23349012", + "SigmaH20 .": "https://www.patreon.com/user/creators?u=34295895", + "Simon Vacker": "https://www.patreon.com/user/creators?u=516915", + "StealthCT ": "https://www.patreon.com/user/creators?u=5055600", + "UpDownLeftDie ": "https://www.patreon.com/user/creators?u=13992640", + "Zep Brattesani": "https://www.patreon.com/user/creators?u=915823", + "asdkola": "https://www.patreon.com/user/creators?u=49505113", + "blyt": "https://www.patreon.com/user/creators?u=47035760", + "hikaruXwiiwalker": "https://www.patreon.com/user/creators?u=152960", + "iamresist ": "https://www.patreon.com/user/creators?u=19164596", + "norlife ": "https://www.patreon.com/user/creators?u=11953551", + "ragesaq": "https://www.patreon.com/user/creators?u=34519727", + "reelmccoy ": "https://www.patreon.com/user/creators?u=2454633", + "sid sawyer": "https://www.patreon.com/user/creators?u=34103367", + "trus0und": "https://www.patreon.com/user/creators?u=43845831", + "tsukasa": "https://www.patreon.com/user/creators?u=23383875", + "zachary harrisson": "https://www.patreon.com/user/creators?u=61387322" +} \ No newline at end of file