borderlands3.20.04.22

这几天连着玩了好几天borderlands3,和我玩的其他游戏一样,这游戏也玩到了玩游戏时间没迫真改游戏时间多的程度

目前bl3由于存档修改器没出,所以只能对武器进行内存修改,据说武器数据其实是在资源文件里的,随机只是在随机buff(那么buff肯定是在存档里面的,为什么我没法修改?),所以现在用CE修改的结果再次打开游戏会失效

但bl3迫真修改的另外一个领域挺有意思的,这游戏其实无论开箱子还是用那个“gun gun”直接刷武器,甚至任务结束领奖励都是在对一个叫做itempool的对象进行随机化操作,如果能找到比如gun gun的指针(CE脚本已经有了),修改其itempool参数,就能想刷什么就刷什么,比如将弹药的itempool放进去,gun gun就变成了ammo gun🤔或者刷10个橙色装备也行,我反正已经集齐了infinity枪🤔

问题是itempool的指针每次运行游戏后都会变,所以需要注入一个borderlands3.dll进去,它据说能实现console但我从来没调用成功过,但它至少能dump出各种对象的指针出来,然后grep一下就能获得itempool指针了🤔我看了下里面有意思的东西多得是,比如有些任务奖励的枪,甚至连gun gun本身都能刷出来(我猜测这个itempool的存在是为了主线后期的某个任务奖励,倒数第二个vault的神器就是这个,但和另外三个不一样,这个是个武器),而且由于gun gun刷出来的枪总是匹配当前等级,如果乐意的话可以一直使用某些装备,免得接着玩下去那些装备变得太弱🤔

另外我还发现了一些有意思的东西,比如dwClipToSpend和BulletsToFire这两个参数,前者如果设为0的话任何武器都能变成infinity(至少infinity是这么设置的),后者如果为0的话表示连发,如果为1或者其他数的话表示点一次鼠标发射的弹药数;gun gun和maliwan的武器一样需要蓄力,但坑爹的是蓄力之后只能发一次(10个武器),这样刷infinity的时候就极其蛋疼,所以我把这两个变量都改成0,fire rate改成2,然后我就可以刷一堆小手枪,然后做infinity hunter了(迫真

Lilith:这就是你迟迟不去寻宝的理由?(手动滑稽

UPDATE:最近bl3来了一波更新,那个临时改武器参数的脚本废了,但改itempool和找出武器指针的脚本还能用

新的event地图里面有新武器,其实只要开event就能在除了飞船外的任何地图刷新武器(因为有哪些可用的itempool其实和地图相关,但很神奇的是地图专属itempool其实还是比较少的),除了一把atlas的武器需要在那个地图的boss itempool里刷;那真的是bl3最神的神器,只需要一颗子弹就能召唤出一把悬空的自动炮塔,能一直射到时间限制结束为止,不像tediore的神器需要浪费一个弹夹而且还有子弹的限制,配合no reload可以刷出几十把炮塔,将任何视线内的敌人扫成筛子🤔像极了rage2里的无限无人机流🤔果然bl3有隐藏class,那就是:飞过来!飞过来!!飞过来!!!(wiebitte

接下来我研究了下更进阶的antics,直接改武器;分析武器指针可以发现武器的永久存储数据只有等级、blueprint和武器附件参数,别的数字形式数据都是由前者算出来的🤔理论上将一把武器的参数全部替换成另外一把武器的参数就能将它直接变成后者,比如我就这样lv1就拿到了gun gun🤔

但问题是lv1是没有什么机会得到eridium的,而这个游戏诡异的地方是如果eridium为0的话是怎么也修改不了的,所以真正可以使用gun gun的时候可能是lv4,第一个地图西北方向(也就是claptrap任务拆COV广播塔的地方再往前)有个隐藏boss,打它就有eridium🤔我记得我那次玩时拿到了eridium准备闪人,然后它一直跟着我到了COV的营地,然后和COV打起来了,接下来居然判断我TM赢了,草(中日双语

既然gun gun没法用,我就打算按照atlas武器的参数改一把那个神器,结果游戏崩了🙃但改另外一款atlas武器时却意外成功🙃我去bl3 moddin' discord上查东西,结果发现就这几天突然出了存档修改器,而且还是web端,爽的1b,直接从另外一个存档搞到了武器数据编码粘贴了过去,这样我终于可以拿神器在lv1时就biubiubiu过去了(手动滑稽🤔

话说回来现在既然已经可以直接粘贴武器进去了,甚至造出游戏中不存在的武器(比如在辐射枪里加上the leech的改良版taser造出辐射伤害的taser枪),我觉得gun gun好像没啥必要了,用claptrap的名言来说,就是“screw you borderlands 3, you can't hurt us anymore”(wiebitte🤔

b r u h s e t t e.20.04.16

我今天下午傻逼了,改频道备份脚本的时候把调试用的message id硬编码到了脚本里面而忘了打注释,导致后面拖的ucc绝大多数频道都没有拖完,更™哭笑不得的是我到拖那个没多少消息的science频道发现第一次返回的就是个空数组才发现这个问题,然后我发现我™把那串玩意还写到github里去了,吓得我赶紧先改了git,然后再接着搞

所谓改git就是先git clone到本地,然后git reset --hard [确认没有出错的commit],然后git push -f,输入github账号和密码,搞定,github那边再也看不到出错的代码了

本来今天晚上我就可以列举出实验数据的,但目前这样我只能先列举出(但愿)没出错部分的数据了

I what data

当然是ucc的数据了(手动滑稽

我用一台vultr最烂的机子(512MB内存,10GB固态,NY/NJ)搞这次实验,而且我利用起来了上次创建到一半就被橄榄的账号,所以只有⑨个webhook线程+1个nitro线程

下面是实验结果:

我们先写一个循环:

for bruh in `ls -tr | grep -Eo "ucc.[a-z\-]*" | uniq`
do
N=(cat "bruh.20.04.16.json" | wc -l)
[ (wc -c < "bruh.20.04.16.sedresults") -eq 0 ] && M=0 || M=(((cat "bruh.20.04.16.sedresults" | wc -l )/2))
echo "bruh(N=N,M=M)"
echo "\`\`\`"
cat "$bruh.20.04.16.timestat"
echo "\`\`\`"
echo
done

然后我们就可以列举结果了(其中N为消息条数,M为附件的数量):

ucc.rules(N=3,M=0)

>>>> time for stage 1:
real    0m0.598s
user    0m0.212s
sys 0m0.163s
>>>> time for stage 2 reupload phase:
real    0m0.069s
user    0m0.030s
sys 0m0.038s
>>>> time for stage 2 sedreplace phase:
real    0m0.008s
user    0m0.001s
sys 0m0.007s
>>>> time for stage 2:
real    0m0.259s
user    0m0.126s
sys 0m0.132s

ucc.general(N=178154,M=8917)

>>>> time for stage 1:
real    40m0.036s
user    15m3.618s
sys 15m59.694s
>>>> time for stage 2 analysis phase:
real    54m40.750s
user    15m8.014s
sys 38m53.228s
>>>> time for stage 2 reupload phase:
real    78m32.942s
user    35m29.197s
sys 24m38.265s
>>>> time for stage 2 sedreplace phase:
real    34m10.949s
user    16m32.306s
sys 16m57.830s
>>>> time for stage 2:
real    167m26.441s
user    67m10.152s
sys 80m30.151s

ucc.parodies(N=3836,M=83)

>>>> time for stage 1:
real    0m58.126s
user    0m24.488s
sys 0m20.151s
>>>> time for stage 2 analysis phase:
real    0m47.037s
user    0m17.923s
sys 0m28.172s
>>>> time for stage 2 reupload phase:
real    0m47.024s
user    0m20.175s
sys 0m11.811s
>>>> time for stage 2 sedreplace phase:
real    0m2.095s
user    0m0.862s
sys 0m1.194s
>>>> time for stage 2:
real    1m36.432s
user    0m39.057s
sys 0m41.348s

ucc.pictures(N=21194,M=3570)

>>>> time for stage 1:
real    4m53.799s
user    1m52.285s
sys 1m55.062s
>>>> time for stage 2 analysis phase:
real    6m52.144s
user    2m17.382s
sys 4m27.690s
>>>> time for stage 2 reupload phase:
real    34m38.977s
user    15m16.545s
sys 10m23.845s
>>>> time for stage 2 sedreplace phase:
real    2m44.607s
user    1m14.663s
sys 1m27.114s
>>>> time for stage 2:
real    44m16.138s
user    18m48.753s
sys 16m18.879s

ucc.games(N=4168,M=474)

>>>> time for stage 1:
real    1m3.273s
user    0m25.020s
sys 0m26.014s
>>>> time for stage 2 analysis phase:
real    1m3.392s
user    0m23.598s
sys 0m38.562s
>>>> time for stage 2 reupload phase:
real    5m11.379s
user    2m7.728s
sys 1m25.108s
>>>> time for stage 2 sedreplace phase:
real    0m11.912s
user    0m4.785s
sys 0m6.849s
>>>> time for stage 2:
real    6m26.957s
user    2m36.216s
sys 2m10.685s

ucc.music(N=3296,M=168)

>>>> time for stage 1:
real    0m57.296s
user    0m25.796s
sys 0m21.075s
>>>> time for stage 2 analysis phase:
real    0m43.922s
user    0m16.960s
sys 0m26.012s
>>>> time for stage 2 reupload phase:
real    10m18.591s
user    1m28.233s
sys 0m59.993s
>>>> time for stage 2 sedreplace phase:
real    0m8.526s
user    0m3.965s
sys 0m4.357s
>>>> time for stage 2:
real    11m11.394s
user    1m49.281s
sys 1m30.579s

ucc.youtube(N=3269,M=63)

>>>> time for stage 1:
real    0m54.414s
user    0m23.364s
sys 0m20.059s
>>>> time for stage 2 analysis phase:
real    0m40.292s
user    0m15.551s
sys 0m23.910s
>>>> time for stage 2 reupload phase:
real    0m46.225s
user    0m15.342s
sys 0m10.395s
>>>> time for stage 2 sedreplace phase:
real    0m1.605s
user    0m0.648s
sys 0m0.894s
>>>> time for stage 2:
real    1m28.441s
user    0m31.681s
sys 0m35.376s

ucc.bots(N=178784,M=15950)

>>>> time for stage 1:
real    43m44.499s
user    18m2.452s
sys 17m22.506s
>>>> time for stage 2 analysis phase:
real    73m5.382s
user    19m30.763s
sys 52m51.512s
>>>> time for stage 2 reupload phase:
real    155m11.269s
user    67m43.191s
sys 46m36.591s
>>>> time for stage 2 sedreplace phase:
real    65m31.364s
user    32m56.373s
sys 31m18.920s
>>>> time for stage 2:
real    293m50.687s
user    120m11.196s
sys 130m48.238s

ucc.spam(N=22191,M=1554)

>>>> time for stage 1:
real    5m8.796s
user    2m9.658s
sys 1m55.477s
>>>> time for stage 2 analysis phase:
real    4m42.811s
user    1m50.327s
sys 2m49.128s
>>>> time for stage 2 reupload phase:
real    35m51.530s
user    9m23.487s
sys 5m36.858s
>>>> time for stage 2 sedreplace phase:
real    2m54.117s
user    1m27.707s
sys 1m23.897s
>>>> time for stage 2:
real    43m29.036s
user    12m41.749s
sys 9m50.207s

ucc.announcements(N=1128,M=56)

>>>> time for stage 1:
real    0m21.185s
user    0m6.881s
sys 0m6.430s
>>>> time for stage 2 analysis phase:
real    0m11.996s
user    0m5.183s
sys 0m6.553s
>>>> time for stage 2 reupload phase:
real    0m46.831s
user    0m14.504s
sys 0m7.984s
>>>> time for stage 2 sedreplace phase:
real    0m1.020s
user    0m0.407s
sys 0m0.594s
>>>> time for stage 2:
real    1m0.074s
user    0m20.181s
sys 0m15.265s

ucc.roleplaying(N=13394,M=202)

>>>> time for stage 1:
real    3m8.108s
user    1m15.497s
sys 1m9.103s
>>>> time for stage 2 analysis phase:
real    2m30.225s
user    0m57.706s
sys 1m29.795s
>>>> time for stage 2 reupload phase:
real    2m19.907s
user    0m54.710s
sys 0m29.106s
>>>> time for stage 2 sedreplace phase:
real    0m6.245s
user    0m2.795s
sys 0m3.315s
>>>> time for stage 2:
real    4m56.968s
user    1m55.423s
sys 2m2.564s

ucc.nsfw(N=67477,M=6063)

>>>> time for stage 1:
real    15m55.261s
user    6m25.597s
sys 6m19.178s
>>>> time for stage 2 analysis phase:
real    17m38.283s
user    5m46.530s
sys 11m41.315s
>>>> time for stage 2 reupload phase:
real    53m7.474s
user    25m51.804s
sys 15m48.258s
>>>> time for stage 2 sedreplace phase:
real    11m18.488s
user    5m36.071s
sys 5m32.812s
>>>> time for stage 2:
real    82m5.272s
user    37m14.776s
sys 33m2.907s

ucc.parody-of-the-month(N=230,M=1)

>>>> time for stage 1:
real    0m4.866s
user    0m1.773s
sys 0m1.734s
>>>> time for stage 2 analysis phase:
real    0m2.490s
user    0m1.095s
sys 0m1.379s
>>>> time for stage 2 reupload phase:
real    0m2.902s
user    0m0.272s
sys 0m0.212s
>>>> time for stage 2 sedreplace phase:
real    0m0.113s
user    0m0.032s
sys 0m0.080s
>>>> time for stage 2:
real    0m5.878s
user    0m1.532s
sys 0m1.907s

ucc.unterganger-of-the-month(N=356,M=4)

>>>> time for stage 1:
real    0m5.512s
user    0m2.075s
sys 0m1.818s
>>>> time for stage 2 analysis phase:
real    0m3.346s
user    0m1.517s
sys 0m1.805s
>>>> time for stage 2 reupload phase:
real    0m3.691s
user    0m0.976s
sys 0m0.576s
>>>> time for stage 2 sedreplace phase:
real    0m0.263s
user    0m0.081s
sys 0m0.180s
>>>> time for stage 2:
real    0m7.569s
user    0m2.674s
sys 0m2.730s

ucc.politics-issues-news(N=39138,M=902)

>>>> time for stage 1:
real    9m52.465s
user    4m1.586s
sys 3m49.775s
>>>> time for stage 2 analysis phase:
real    11m59.082s
user    2m56.054s
sys 5m24.818s
>>>> time for stage 2 reupload phase:
real    7m53.525s
user    3m55.623s
sys 2m11.564s
>>>> time for stage 2 sedreplace phase:
real    1m11.090s
user    0m32.826s
sys 0m37.067s
>>>> time for stage 2:
real    21m4.250s
user    7m24.727s
sys 8m13.773s

ucc.personal-venting(N=63703,M=1814)

>>>> time for stage 1:
real    15m24.444s
user    5m45.986s
sys 6m9.725s
>>>> time for stage 2 analysis phase:
real    17m28.200s
user    5m28.831s
sys 11m35.278s
>>>> time for stage 2 reupload phase:
real    19m5.728s
user    7m44.789s
sys 4m42.570s
>>>> time for stage 2 sedreplace phase:
real    2m53.872s
user    1m22.623s
sys 1m28.695s
>>>> time for stage 2:
real    39m28.740s
user    14m36.596s
sys 17m47.007s

ucc.welcome-goodbye(N=12510,M=154)

>>>> time for stage 1:
real    2m57.746s
user    1m8.830s
sys 1m7.993s
>>>> time for stage 2 analysis phase:
real    2m48.142s
user    1m1.245s
sys 1m42.571s
>>>> time for stage 2 reupload phase:
real    1m30.062s
user    0m38.672s
sys 0m22.933s
>>>> time for stage 2 sedreplace phase:
real    0m5.497s
user    0m2.299s
sys 0m3.066s
>>>> time for stage 2:
real    4m24.047s
user    1m42.358s
sys 2m8.766s

ucc.feedback-support(N=4354,M=74)

>>>> time for stage 1:
real    1m3.929s
user    0m24.427s
sys 0m24.672s
>>>> time for stage 2 analysis phase:
real    0m54.821s
user    0m21.481s
sys 0m31.699s
>>>> time for stage 2 reupload phase:
real    1m0.924s
user    0m19.385s
sys 0m12.476s
>>>> time for stage 2 sedreplace phase:
real    0m1.948s
user    0m0.762s
sys 0m1.088s
>>>> time for stage 2:
real    1m57.993s
user    0m41.722s
sys 0m45.465s

ucc.pokemon-bots(N=69043,M=83)

>>>> time for stage 1:
real    17m31.568s
user    6m41.507s
sys 6m54.745s
>>>> time for stage 2 analysis phase:
real    18m10.107s
user    5m35.012s
sys 12m10.210s
>>>> time for stage 2 reupload phase:
real    1m28.991s
user    0m22.092s
sys 0m13.200s
>>>> time for stage 2 sedreplace phase:
real    0m10.733s
user    0m5.372s
sys 0m5.145s
>>>> time for stage 2:
real    19m50.917s
user    6m2.850s
sys 12m29.112s

ucc.rules-dca(N=1,M=0)

>>>> time for stage 1:
real    0m0.557s
user    0m0.190s
sys 0m0.133s
>>>> time for stage 2 reupload phase:
real    0m0.084s
user    0m0.026s
sys 0m0.058s
>>>> time for stage 2 sedreplace phase:
real    0m0.011s
user    0m0.002s
sys 0m0.006s
>>>> time for stage 2:
real    0m0.337s
user    0m0.123s
sys 0m0.208s

ucc.best-audio-based(N=163,M=1)

>>>> time for stage 1:
real    0m3.159s
user    0m1.041s
sys 0m1.114s
>>>> time for stage 2 analysis phase:
real    0m1.884s
user    0m0.770s
sys 0m1.057s
>>>> time for stage 2 reupload phase:
real    0m2.829s
user    0m0.264s
sys 0m0.222s
>>>> time for stage 2 sedreplace phase:
real    0m0.103s
user    0m0.040s
sys 0m0.061s
>>>> time for stage 2:
real    0m5.074s
user    0m1.158s
sys 0m1.512s

ucc.best-current-events(N=363,M=3)

>>>> time for stage 1:
real    0m6.164s
user    0m2.346s
sys 0m2.096s
>>>> time for stage 2 analysis phase:
real    0m4.232s
user    0m1.737s
sys 0m2.326s
>>>> time for stage 2 reupload phase:
real    0m6.055s
user    0m0.773s
sys 0m0.582s
>>>> time for stage 2 sedreplace phase:
real    0m0.261s
user    0m0.083s
sys 0m0.174s
>>>> time for stage 2:
real    0m10.846s
user    0m2.692s
sys 0m3.281s

ucc.best-dpmv(N=309,M=4)

>>>> time for stage 1:
real    0m5.095s
user    0m1.803s
sys 0m1.815s
>>>> time for stage 2 analysis phase:
real    0m3.480s
user    0m1.484s
sys 0m1.923s
>>>> time for stage 2 reupload phase:
real    0m3.917s
user    0m1.032s
sys 0m0.654s
>>>> time for stage 2 sedreplace phase:
real    0m0.155s
user    0m0.070s
sys 0m0.083s
>>>> time for stage 2:
real    0m7.845s
user    0m2.697s
sys 0m2.840s

ucc.best-fx(N=188,M=1)

>>>> time for stage 1:
real    0m3.332s
user    0m1.147s
sys 0m1.165s
>>>> time for stage 2 analysis phase:
real    0m2.353s
user    0m0.907s
sys 0m1.393s
>>>> time for stage 2 reupload phase:
real    0m2.776s
user    0m0.270s
sys 0m0.224s
>>>> time for stage 2 sedreplace phase:
real    0m0.122s
user    0m0.047s
sys 0m0.064s
>>>> time for stage 2:
real    0m5.521s
user    0m1.310s
sys 0m1.864s

ucc.best-parody-by-a-newcomer(N=216,M=3)

>>>> time for stage 1:
real    0m3.999s
user    0m1.389s
sys 0m1.331s
>>>> time for stage 2 analysis phase:
real    0m2.521s
user    0m1.012s
sys 0m1.441s
>>>> time for stage 2 reupload phase:
real    0m3.483s
user    0m0.758s
sys 0m0.503s
>>>> time for stage 2 sedreplace phase:
real    0m0.140s
user    0m0.057s
sys 0m0.081s
>>>> time for stage 2:
real    0m6.394s
user    0m1.929s
sys 0m2.172s

ucc.best-series(N=128,M=2)

>>>> time for stage 1:
real    0m2.613s
user    0m0.861s
sys 0m0.850s
>>>> time for stage 2 analysis phase:
real    0m1.715s
user    0m0.664s
sys 0m0.970s
>>>> time for stage 2 reupload phase:
real    0m3.172s
user    0m0.541s
sys 0m0.386s
>>>> time for stage 2 sedreplace phase:
real    0m0.134s
user    0m0.052s
sys 0m0.076s
>>>> time for stage 2:
real    0m5.286s
user    0m1.355s
sys 0m1.598s

ucc.best-story-based(N=172,M=1)

>>>> time for stage 1:
real    0m3.167s
user    0m1.073s
sys 0m1.060s
>>>> time for stage 2 analysis phase:
real    0m2.035s
user    0m0.823s
sys 0m1.147s
>>>> time for stage 2 reupload phase:
real    0m2.768s
user    0m0.270s
sys 0m0.222s
>>>> time for stage 2 sedreplace phase:
real    0m0.101s
user    0m0.037s
sys 0m0.063s
>>>> time for stage 2:
real    0m5.181s
user    0m1.240s
sys 0m1.593s

ucc.best-video-game-based(N=235,M=1)

>>>> time for stage 1:
real    0m4.384s
user    0m1.519s
sys 0m1.389s
>>>> time for stage 2 analysis phase:
real    0m2.803s
user    0m1.136s
sys 0m1.567s
>>>> time for stage 2 reupload phase:
real    0m2.997s
user    0m0.278s
sys 0m0.221s
>>>> time for stage 2 sedreplace phase:
real    0m0.101s
user    0m0.036s
sys 0m0.061s
>>>> time for stage 2:
real    0m6.175s
user    0m1.567s
sys 0m2.003s

ucc.most-humorous(N=367,M=3)

>>>> time for stage 1:
real    0m6.181s
user    0m2.235s
sys 0m2.249s
>>>> time for stage 2 analysis phase:
real    0m4.521s
user    0m1.864s
sys 0m2.551s
>>>> time for stage 2 reupload phase:
real    0m5.886s
user    0m0.728s
sys 0m0.563s
>>>> time for stage 2 sedreplace phase:
real    0m0.147s
user    0m0.042s
sys 0m0.103s
>>>> time for stage 2:
real    0m10.803s
user    0m2.733s
sys 0m3.365s

ucc.most-innovative(N=226,M=2)

>>>> time for stage 1:
real    0m3.829s
user    0m1.382s
sys 0m1.431s
>>>> time for stage 2 analysis phase:
real    0m2.671s
user    0m1.087s
sys 0m1.521s
>>>> time for stage 2 reupload phase:
real    0m3.847s
user    0m0.485s
sys 0m0.372s
>>>> time for stage 2 sedreplace phase:
real    0m0.116s
user    0m0.047s
sys 0m0.068s
>>>> time for stage 2:
real    0m6.876s
user    0m1.696s
sys 0m2.123s

ucc.transportation(N=8875,M=907)

>>>> time for stage 1:
real    2m17.521s
user    0m52.525s
sys 0m52.450s
>>>> time for stage 2 analysis phase:
real    2m27.892s
user    0m54.824s
sys 1m29.327s
>>>> time for stage 2 reupload phase:
real    13m57.523s
user    4m3.844s
sys 2m44.045s
>>>> time for stage 2 sedreplace phase:
real    0m28.523s
user    0m12.060s
sys 0m15.827s
>>>> time for stage 2:
real    16m54.303s
user    5m10.847s
sys 4m29.437s

ucc.pokemon(N=1571,M=207)

>>>> time for stage 1:
real    0m25.140s
user    0m9.312s
sys 0m9.405s
>>>> time for stage 2 analysis phase:
real    0m24.955s
user    0m9.937s
sys 0m14.716s
>>>> time for stage 2 reupload phase:
real    2m21.297s
user    0m56.130s
sys 0m36.807s
>>>> time for stage 2 sedreplace phase:
real    0m4.689s
user    0m1.801s
sys 0m2.762s
>>>> time for stage 2:
real    2m51.213s
user    1m7.955s
sys 0m54.467s

ucc.technology(N=1473,M=72)

>>>> time for stage 1:
real    0m22.791s
user    0m8.519s
sys 0m8.911s
>>>> time for stage 2 analysis phase:
real    0m19.449s
user    0m8.012s
sys 0m11.196s
>>>> time for stage 2 reupload phase:
real    0m55.958s
user    0m18.453s
sys 0m12.080s
>>>> time for stage 2 sedreplace phase:
real    0m1.580s
user    0m0.642s
sys 0m0.901s
>>>> time for stage 2:
real    1m17.286s
user    0m27.224s
sys 0m24.354s

ucc.film-tv(N=2543,M=105)

>>>> time for stage 1:
real    0m37.866s
user    0m14.915s
sys 0m14.765s
>>>> time for stage 2 analysis phase:
real    0m32.578s
user    0m13.279s
sys 0m18.702s
>>>> time for stage 2 reupload phase:
real    0m57.283s
user    0m26.494s
sys 0m17.257s
>>>> time for stage 2 sedreplace phase:
real    0m2.512s
user    0m1.010s
sys 0m1.461s
>>>> time for stage 2:
real    1m32.695s
user    0m40.901s
sys 0m37.623s

ucc.sports(N=1192,M=81)

>>>> time for stage 1:
real    0m18.639s
user    0m7.179s
sys 0m7.196s
>>>> time for stage 2 analysis phase:
real    0m15.726s
user    0m6.550s
sys 0m9.009s
>>>> time for stage 2 reupload phase:
real    1m10.613s
user    0m20.647s
sys 0m14.061s
>>>> time for stage 2 sedreplace phase:
real    0m1.777s
user    0m0.727s
sys 0m1.034s
>>>> time for stage 2:
real    1m28.410s
user    0m28.021s
sys 0m24.299s

ucc.ums-general(N=3190,M=95)

>>>> time for stage 1:
real    0m46.793s
user    0m18.700s
sys 0m18.251s
>>>> time for stage 2 analysis phase:
real    0m40.276s
user    0m16.657s
sys 0m22.902s
>>>> time for stage 2 reupload phase:
real    1m8.613s
user    0m24.517s
sys 0m16.028s
>>>> time for stage 2 sedreplace phase:
real    0m2.369s
user    0m0.947s
sys 0m1.326s
>>>> time for stage 2:
real    1m51.528s
user    0m42.216s
sys 0m40.431s

ucc.ums-pictures(N=1066,M=266)

>>>> time for stage 1:
real    0m15.732s
user    0m6.127s
sys 0m6.069s
>>>> time for stage 2 analysis phase:
real    0m21.324s
user    0m8.216s
sys 0m12.682s
>>>> time for stage 2 reupload phase:
real    2m38.321s
user    1m7.286s
sys 0m45.061s
>>>> time for stage 2 sedreplace phase:
real    0m5.464s
user    0m2.027s
sys 0m3.331s
>>>> time for stage 2:
real    3m5.341s
user    1m17.608s
sys 1m1.226s

ucc.untercast(N=6845,M=530)

>>>> time for stage 1:
real    1m48.483s
user    0m40.838s
sys 0m40.556s
>>>> time for stage 2 analysis phase:
real    1m48.122s
user    0m41.829s
sys 1m4.776s
>>>> time for stage 2 reupload phase:
real    7m49.343s
user    2m16.626s
sys 1m35.477s
>>>> time for stage 2 sedreplace phase:
real    0m15.732s
user    0m6.441s
sys 0m8.818s
>>>> time for stage 2:
real    9m53.504s
user    3m5.025s
sys 2m49.246s

ucc.server-invite-link(N=2,M=0)

>>>> time for stage 1:
real    0m0.641s
user    0m0.182s
sys 0m0.208s
>>>> time for stage 2 reupload phase:
real    0m0.106s
user    0m0.028s
sys 0m0.056s
>>>> time for stage 2 sedreplace phase:
real    0m0.012s
user    0m0.004s
sys 0m0.006s
>>>> time for stage 2:
real    0m0.324s
user    0m0.106s
sys 0m0.192s

ucc.anime-manga(N=15302,M=2867)

>>>> time for stage 1:
real    3m53.946s
user    1m30.287s
sys 1m31.074s
>>>> time for stage 2 analysis phase:
real    5m38.263s
user    1m56.936s
sys 3m35.981s
>>>> time for stage 2 reupload phase:
real    24m42.708s
user    12m0.428s
sys 7m48.289s
>>>> time for stage 2 sedreplace phase:
real    2m0.582s
user    0m52.916s
sys 1m6.151s
>>>> time for stage 2:
real    32m22.060s
user    14m50.442s
sys 12m30.715s

ucc.memes(N=5054,M=1186)

>>>> time for stage 1:
real    1m16.949s
user    0m29.395s
sys 0m31.031s
>>>> time for stage 2 analysis phase:
real    1m44.958s
user    0m39.258s
sys 1m4.518s
>>>> time for stage 2 reupload phase:
real    50m14.584s
user    4m41.889s
sys 3m12.321s
>>>> time for stage 2 sedreplace phase:
real    0m30.521s
user    0m12.461s
sys 0m17.750s
>>>> time for stage 2:
real    52m30.390s
user    5m33.754s
sys 4m34.770s

ucc.food(N=4161,M=433)

>>>> time for stage 1:
real    1m6.912s
user    0m25.735s
sys 0m25.955s
>>>> time for stage 2 analysis phase:
real    1m7.046s
user    0m25.823s
sys 0m40.645s
>>>> time for stage 2 reupload phase:
real    3m58.520s
user    1m54.117s
sys 1m18.193s
>>>> time for stage 2 sedreplace phase:
real    0m11.407s
user    0m4.454s
sys 0m6.843s
>>>> time for stage 2:
real    5m17.242s
user    2m24.494s
sys 2m5.848s

ucc.duckhunt(N=118065,M=70)

>>>> time for stage 1:
real    30m25.377s
user    12m42.342s
sys 12m4.405s
>>>> time for stage 2 analysis phase:
real    33m8.739s
user    10m41.799s
sys 22m4.306s
>>>> time for stage 2 reupload phase:
real    1m14.276s
user    0m20.465s
sys 0m11.595s
>>>> time for stage 2 sedreplace phase:
real    0m11.667s
user    0m5.498s
sys 0m5.977s
>>>> time for stage 2:
real    34m35.979s
user    11m8.231s
sys 22m22.559s

ucc.lego(N=334,M=48)

>>>> time for stage 1:
real    0m5.580s
user    0m2.334s
sys 0m1.999s
>>>> time for stage 2 analysis phase:
real    0m5.424s
user    0m2.339s
sys 0m3.005s
>>>> time for stage 2 reupload phase:
real    0m32.945s
user    0m12.547s
sys 0m7.392s
>>>> time for stage 2 sedreplace phase:
real    0m0.933s
user    0m0.386s
sys 0m0.538s
>>>> time for stage 2:
real    0m39.560s
user    0m15.371s
sys 0m11.090s

ucc.my-little-pony(N=1524,M=379)

>>>> time for stage 1:
real    0m22.741s
user    0m9.399s
sys 0m8.386s
>>>> time for stage 2 analysis phase:
real    0m29.876s
user    0m12.084s
sys 0m17.392s
>>>> time for stage 2 reupload phase:
real    4m12.570s
user    1m36.639s
sys 0m59.956s
>>>> time for stage 2 sedreplace phase:
real    0m7.781s
user    0m3.143s
sys 0m4.565s
>>>> time for stage 2:
real    4m50.525s
user    1m51.987s
sys 1m22.078s

ucc.boxbot(N=3755,M=291)

>>>> time for stage 1:
real    0m59.068s
user    0m24.940s
sys 0m22.502s
>>>> time for stage 2 analysis phase:
real    0m55.921s
user    0m23.047s
sys 0m32.131s
>>>> time for stage 2 reupload phase:
real    3m29.539s
user    1m13.747s
sys 0m47.713s
>>>> time for stage 2 sedreplace phase:
real    0m7.230s
user    0m2.781s
sys 0m4.310s
>>>> time for stage 2:
real    4m33.102s
user    1m39.705s
sys 1m24.432s

ucc.ucc-news(N=907,M=40)

>>>> time for stage 1:
real    0m14.899s
user    0m5.605s
sys 0m5.452s
>>>> time for stage 2 analysis phase:
real    0m11.960s
user    0m5.109s
sys 0m6.550s
>>>> time for stage 2 reupload phase:
real    0m28.593s
user    0m10.179s
sys 0m6.545s
>>>> time for stage 2 sedreplace phase:
real    0m1.175s
user    0m0.410s
sys 0m0.728s
>>>> time for stage 2:
real    0m42.098s
user    0m15.825s
sys 0m14.060s

ucc.science(N=249,M=2)

>>>> time for stage 1:
real    0m4.172s
user    0m1.664s
sys 0m1.641s
>>>> time for stage 2 analysis phase:
real    0m3.094s
user    0m1.279s
sys 0m1.789s
>>>> time for stage 2 reupload phase:
real    0m3.610s
user    0m0.527s
sys 0m0.422s
>>>> time for stage 2 sedreplace phase:
real    0m0.140s
user    0m0.042s
sys 0m0.097s
>>>> time for stage 2:
real    0m7.111s
user    0m1.939s
sys 0m2.483s

ucc.newcomer-of-the-year(N=24,M=0)

>>>> time for stage 1:
real    0m0.900s
user    0m0.355s
sys 0m0.298s
>>>> time for stage 2 reupload phase:
real    0m0.079s
user    0m0.022s
sys 0m0.055s
>>>> time for stage 2 sedreplace phase:
real    0m0.011s
user    0m0.003s
sys 0m0.006s
>>>> time for stage 2:
real    0m0.305s
user    0m0.104s
sys 0m0.196s

可以去迫真拟合一下sedreplace的时间复杂度是不是O(NM),至于其他阶段,第一阶段只有O(N),第二阶段分析时也只有O(N),上传时只有O(M),由于线程数是常量无论除以线程数还是除以线程数的平方还是除以别的什么都无关紧要

II what next

等我在ucc上测试成功后,我打算拿它去测试church of pancakechi,然后看下有没有心情开示它的整个消息记录;好了,我现在可以去写hakushinsona或者打完borderlands3了

bruhbitte.20.04.16

草,我这几天突然写不动fanfic了🤔所以我在搞些别的玩意,比如完成了从discord的guild元数据中找到能拖的频道(检查一下是不是missing access即可)并生成备份频道脚本可以接受的参数sh文件的脚本(这名字真™长🤔

然后在频道备份脚本里加了个迫真profiler,可以迫真统计每个阶段所花的时间🤔这样我就可以去尝试一次性备份整个ucc了,尽管看起来并没有什么卵用🤔由于肯定需要向discord发送十万甚至九万个请求,我搞了台vultr的🐣跑🤔

话说回来我觉得kamoganger chat central已经是个巨型乐子了,但接下来我肯定要拿这个脚本dump下church of akechi,搞不好还可以找个地方开示dump,那才是最大的乐子🤔

jonobitte.20.04.12

jono chan今天突然表现出了大脑降级的症状,比如认为我在unterganger频道里的迫真unterganger猫讨论(其实我还是在花式乳ucc,比如贵频道实在是太™水了,一只猫都能做5个视频获得unterganger role)是冻鳗相关,让我转移到anime频道去;我在解释我只是在讨论VHQ家的猫,结果这个憨批直接开始对我入狱威胁了,草(中日双语)的1b🤔🤣

所以我就在anime频道迫真讨论VHQ的猫,来讽刺jono的大脑降级行为😂我不清楚我这算不算钓鱼,但如果一个喵酱都能触发jono的冻鳗PTSD症状并使其大脑降级的话,我觉得jono的冻鳗PTSD已经到晚期了🤔此人乐子已经变得无限大了🤔难怪前段时间raymond chan会突然拿他取乐🤔搞不好我们可以找个他不是管理的聊天室来乐他🤔

ps. 开示jono chan的暴论(给我自己和VHQ迫真打码,反正恁已经上unterganger hall of arseholes了,就不用在意本野爹再挂恁几条笑话了

{"jono jokes location": "unterganger channel", "jokes": [
{"id": "698883720769306654", "type": 0, "content": "<@!XXXXXXXXXXXXXXXXXX> <@!XXXXXXXXXXXXXXXXXX> take your weeby shit to <#538811593111371797>", "channel_id": "406930921007087616", "author": {"id": "223865652463534091", "username": "Jono(JSalty254)(CTzen)", "avatar": "6967c71ceccc1184bc518cef2bd638f9", "discriminator": "8331", "public_flags": 0}, "attachments": [], "embeds": [], "mentions": [{"id": "XXXXXXXXXXXXXXXXXX", "username": "Dark Slash X", "avatar": "203365e0c282b76b2e1096b4ce46db31", "discriminator": "XXXX", "public_flags": 64}, {"id": "XXXXXXXXXXXXXXXXXX", "username": "ddOs", "avatar": "a_ddacbc7c5af5bbda7640bd2ff835582b", "discriminator": "XXXX", "public_flags": 0}], "mention_roles": [], "pinned": false, "mention_everyone": false, "tts": false, "timestamp": "2020-04-12T13:14:23.663000+00:00", "edited_timestamp": null, "flags": 0},
{"id": "698883798418587668", "type": 0, "content": "Especially you ddOs", "channel_id": "406930921007087616", "author": {"id": "223865652463534091", "username": "Jono(JSalty254)(CTzen)", "avatar": "6967c71ceccc1184bc518cef2bd638f9", "discriminator": "8331", "public_flags": 0}, "attachments": [], "embeds": [], "mentions": [], "mention_roles": [], "pinned": false, "mention_everyone": false, "tts": false, "timestamp": "2020-04-12T13:14:42.176000+00:00", "edited_timestamp": null, "flags": 0},
{"id": "XXXXXXXXXXXXXXXXXX", "type": 0, "content": "weebitte? it's only his cat max", "channel_id": "406930921007087616", "author": {"id": "XXXXXXXXXXXXXXXXXX", "username": "ddOs", "avatar": "a_ddacbc7c5af5bbda7640bd2ff835582b", "discriminator": "XXXX", "public_flags": 0}, "attachments": [], "embeds": [], "mentions": [], "mention_roles": [], "pinned": false, "mention_everyone": false, "tts": false, "timestamp": "2020-04-12T13:15:02.756000+00:00", "edited_timestamp": null, "flags": 0},
{"id": "698889801113272331", "type": 0, "content": "ddOs, you're already on thin ice", "channel_id": "406930921007087616", "author": {"id": "223865652463534091", "username": "Jono(JSalty254)(CTzen)", "avatar": "6967c71ceccc1184bc518cef2bd638f9", "discriminator": "8331", "public_flags": 0}, "attachments": [], "embeds": [], "mentions": [], "mention_roles": [], "pinned": false, "mention_everyone": false, "tts": false, "timestamp": "2020-04-12T13:38:33.330000+00:00", "edited_timestamp": null, "flags": 0}]}

bruh

f u t a b r u h.20.04.11

草,我发现ao3的html编辑器就是一坨翔,准确点来说所有的html编辑器都是一坨翔,总是搞一大堆没用的标签,而且更草的是我把东西导出到word里面做拼写和语法检查,完事后我tm发现我怎么都没法导入回ao3的html编辑器了,这就很™蛋疼了

所以我最后只好导出成html,当然word导出的html更是一坨翔,但我复制了html排版后的文本到ao3的html代码页过去,发现它至少保持了原来的分段结构(迫真),至于别的排版就丢得完全没了

光改成原来的分段就花了半小时,然后我在想干脆改成markdown算了,然后随便找个markdown编辑器粘贴进去,然后查看右边内容的dom源代码,这样不就能生成干净的html代码了?或者latex都行,什么转html(word除外)都比html编辑器好用

所以我的迫真sona以后都准备用markdown写了,我™发现哪怕notepad++都比ao3自带的编辑器好用;至于microsoft的那款文字处理软件,我觉得它可能检查语法比较高级(比如我经常搞不清楚的单复数和时态),别的就算了——当然我还是希望它不要干掉我的markdown元字符

对了,https://cdn.discordapp.com/attachments/696792478908416130/698528805832360036/hakushinsona1.md

b r u h

另外插播一条死🐴新闻,继禁止乳HRP之后,UCC正式禁止乳强了,果然是一群迫真文明人🙃和乳HRP还不太一样(只有jennie chan在高强度乳HRP,其他人包括我只是在便乘),乳强完全就是贵聊天室的早期娱乐之一(我有很多证据说明这点,比如UCC的迫真赛博监狱一开始就是用来关李志强的),现在你们这群司马人这么搞完全就是又当又立🙃尤其是那个叫做kevin的死🐴管理,™一天到晚嚷嚷着让toilet这事翻篇,连话术都™和日本鬼子完全一样,要么这个憨批压根就不了解UCC的黑历史,要么他知道,但还是像他的土鸡祖先翻篇亚美利亚人大屠杀一样翻篇了,如果是这样的话,我对土耳其这个连日本都不如的迫真文明国家的厌恶程度又增进了一分🤔日本好歹还制造了anime(迫真),你土耳其制造了什么?烤肉?🤔

不过话说回来我的guild也受到了UCC的部分影响,比如我就保留了一个作用和赛博囚犯相当的role,不过叫做管理员(因为我压根就不需要任何管理员,而之前那个叛徒就嚷嚷着让我给他个管理员,所以我就“给了”他一个迫真管理员)🤔而且我搞这个不是想做网络警察,而是为了对于某些该ban掉而我懒得ban的成员,进行迫真嘲讽🤔如果某人被当选(迫真)管理员了,它应该看不到任何一个频道,更不会有一个迫真赛博监狱频道赛博容纳它🤔

另外我的一台主力vps被discord限流了,表现就是什么请求都需要两秒才能完成,无论是获取消息还是别的🤔看来以后搞discord antics我可能需要雇用其他vps来做了,ibm的🐔儿至少拖消息是不好使的🤔比如vultr就挺适合做这件事的🤔实测vultr的🐔儿只需512MB内存就能支持10线程同时上传和替换,外加里面装了固态,应该更快一点🤔其实如果discord支持ipv6的话会更爽,很可惜它不支持,是不是由于它用的couldflare的缘故🤔我早期也迫真配置过双栈,但现在我用cloudflare来托管博客了,我已经懒得管我有没有双栈了🤔

hakushinsona chapter 2.20.04.10

没想到我真的把这迫真sona写完了!这是第二章,我才开始写

I review

在ao3上写东西总体来说没有在wp上面方便,毕竟没有markdown用,只有html,让我瞬间回到了当年使用qq空间长篇大论的时代🤔

奇怪的是它那个编辑器反正比qq空间的好用,写一万词都不会卡🤔问题是它不带语法检查,所以我感觉后期打了不少错别字,恐怕我得导出到某款带语法检查的软件里检查下了,实在不行我总不能再找个VM装个word吧🙃

我一开始的几章是在discord上写的,那时应该是7号的凌晨几点,而我的ao3帐号应该是到下午才通过邀请并建好的🙃这导致前几章充满了discord聊天消息风格,因为我一般聊天就是那种语气;后面转到ao3上后我写作风格越来越正式了(毕竟在discord上写在我看来效率越来越差),甚至后来在discord上聊天也习惯性地注意大小写语法了🤔

其实将飞过来设计成主角很意外,我那死🐴twitter又搞得我在BJK聊天室也被关了禁闭(其实我早就和BJK建立了迫真同盟关系,但禁不住drate chan那个婊子在瞎逼逼,想必他们对迫真正义的迫真追求就真的比我们的同盟关系还重要嘛,这群精神西方人大脑完全降级了),只不过这次他们确定我的twitter只有钓鱼内容后又放我出来了,而我只是让他们过了一把网络警察瘾而已🤔这群傻逼建的聊天室规模连ucc都不如,网络警察瘾却™一个比一个大,还模仿ucc建立了赛博监狱,迫真正义很™爽是吧🤔既然drate chan那个婊子那么恨我,要么干脆给我建一个赛博灵堂得了,反正drateganger chat central也早就存在了🤔然后他们居然觉得我在twitter上给飞过来庆生有所不妥,所以我干脆做一个飞过来的后裔,然后乐他们🤔

前几章的kamoganger chat central可以说是对unterganger chat central的直球戏仿,甚至连它的迫真社区奖项都戏仿了,我之前不是搞过ucc的迫真复刻吗,我只需要改改词语就能建个新模板,所以我能写得如此详细🤔顺便我™真的做了个kcc的模板,但建立新聊天室还是算了🙃

我倒是想挂几个ucc婊子上去,就像我不停地在这个迫真sona里面以各种姿势乳强一样,但我后面发现挂他们的话整个作品的篇幅就太不平衡了(其实最后两小节才是最不平衡的),所以没有挂🤔

antic master作为元首鬼畜的必备元素,我觉得每个人对此的理解都不一样,但至少我在我塑造的主角里融入了我对antic master的理解:整人钓鱼借刀恶俗无下限,但和反派kamoshida以及隐藏反派(迫真)李志强不同,有着最基本的良知🤔

为了乳强我把整个背景都从东京搬到了台南,甚至shujin也在台南开了个分校;而kamoshida也像我们日常乳强那样设定成了台日混血(迫真;但既然背景在台南了,那么乳ROC也可以乳一乳,毕竟乳ROC本来就是toiletgangin'的一环,而且ROC本来就是个连主权都没有的迫真国家(说得像是ROC在大陆的时候就有很多主权一样🤔),比如上古巨魔raymond chan就以乳ROC为乐,天天spam mention李志强“台湾是中国的”🤔

除了乳ROC外我还顺便乳了一句Lea chan🤔kamogangin'尽管说是放大版的toiletgangin',但和屁都留不下的toilet chan相比,kamoshida还是留下了不少的鬼畜素材,所以kamogangin'可以被无限放大,比如我写的什么一个月还是一周来着就能众筹一万美元机票啥的

具体来说在我迁移到ao3以及开始写去台南真人快打之后,我便开始迫真考据了起来,比如我™真的查过柏林到台南的机票;但我后面打算写更加迫真和生草的内容,外加柏林到台南压根就没有直达航班,我开始脑洞出了一个迫真主意,主角通过停留在公海上的船放出登陆艇(迫真)渗透进台南,瞬间从元首恶搞片变成迫真特种行动🤔所以他们先飞到菲律宾的首都,从那里坐渔船到公海,然后登上他们的船,这样他们就只留下出入境菲律宾的记录;到最后这艘船就变成了手撕ROC海军的飞过来战舰(手动滑稽

既然剧情变成了这样,我便做了一番更加迫真的考据,比如用google maps真的看过台南的海岸线,然后将toilet chan泄露的住址设定好,我看了下河道得出了用登陆艇进入河道就能步行1.3km到迫真shujin的迫真结论;接下来我写的东西和那天列出的大纲基本上差别不大,除了顺序不太一样,实际版本中先策反了takemi再招募到mishima;另外我还搞了个“台南抵抗组织”,所以我一不小心把nordfront也乳了一遍🤔

顺便一提这个和untergangers也有点迫真关系,jennie chan是nordfront的外围粉丝

和原计划不太一样的是我没有写tainanfront的一些细节(比如详细介绍日批纳粹主义这种新意识形态,主要是因为我想赶紧写完这玩意),总体来说tainanfront我甚至都没有花太多功夫写,他们就一把火烧了kamoshida的豪宅然后又暴动了几天,完了;说不定下次修订的时候我会加上,但现在就算了🙃

当然我觉得在tainanfront暴动烧建筑时乳kamoshida这个剧情过于扯淡,尽管我写的是迫真sona,但这也太™的假了,我最后还是改成了先乳kamoshida再暴动,这样至少它看起来更加靠谱一些,所以这也就是为什么我没有描写太多tainanfront;再说了把它渲染成迫真革命,我觉得我的英文水平可能没那么高吧,不然绝对会非常生草

另外主角借刀李志强乳kamoshida的那段我感觉没写好,可能需要回炉重造一遍,毕竟在我原来的计划中我打算把我的toiletganglogy史观便乘进去:李志强变成巨魔和台南抵抗组织烧死了不少人一样,完全是大脑降级的西方世界自己作的孽(raymond chan快出来挨打);我看着重新写下那几段吧🙃

原来的大纲里面并没有大战ROC海军的那节,那个迫真海战完全是我™看多了perusona3 the movies #3写出来的;毕竟我之前在某处还是插入了一整章黑屁perusona3的章节,比如perusona3系列其实是kirijo group的植入广告之类的🙃而我给p4的小镇和p5的奥村食品也强行安排了个PMC进去(但我主要是要借p3乳p5fags,p4可能不会怎么涉及,除非我准备写主角和chie chan的破处小黄文)🤔当然乳ROC(或者说乳刮民党/迫真挺DPP)可比乳强有意思多了,刮民党从大陆开始就是个大号的土匪,可以从192X一直乳到今天;比如ROC海军就对大陆和菲律宾难民犯下不少战争罪行(奇怪的是我找不到wikipedia上的文章,可见会英语的台湾人真™不是东西,比如李志强,比如在wikipedia上抹除ROC战争罪行的憨批),我就只能用这些基本上只在我记忆中的材料(当然你要是在知乎上问,肯定会有人回答,但知乎答案能当证据用吗,草;再说为什么我要关注证据,这整篇文章都叫迫真sona了,为什么我需要在直球乳ROC的时候有丝毫顾忌)搞了一个也叫李志强的上将,在整个游艇的所有人面前鼓吹ROC的战争罪行,比日本人还不要脸;然后志强号驱逐舰(高雄级,我尽管说不是舰娘玩家,但我™还是做了点迫真功课的,比如发现ROC海军只有四艘驱逐舰,而且还全是原先准备卖给伊朗王国的,后面伊朗不是王国了才转卖给ROC的)就遭到了以perusona为动力的舰载轨道炮的正义爆破,被炸得连渣都不剩🤔而且我™还疯狂玩了一顿cyka blyat idinahui梗嫁祸俄罗斯,甚至还编出了一个用来恶心ROC宪兵的迫真ПЕРУСОНА理论,这完全就是antic master的标准流程🤔这™才是整个章节的高潮,而不是制裁kamoshida🤔

II plans

说实话我还没想好之后的章节,如果按照perusona 5的原版剧情,该怎么写;毕竟kamoshida之所以有写头,完全是因为存在kamoshida李志强说这样的迫真理论,就像cookie迫真戏仿真夏夜的淫梦第二章,kamoshida也有不少的李志强要素🤔但perusona 5其他的bosses,我就提不起来兴致,比如那个画家,还有那个黑社会,由于我对yusuki和makoto都没什么太大的兴趣,可能我会把它们全部砍掉;再说了,每次遇见boss就玩一顿-ganger Chat Central梗也未免太没意思了,kamoshida之所以能-gang是因为他就是个大号的李志强,但基本上只有狮童正义可以迫真cosplay几把元首;当然出于显而易见的原因,我肯定要乳一顿明智,Akechiganger Chat Central搞不好会成为我真正运营的乳明聊天室;唯一值得写的是原创的hufumi章节,而且由于主角可以全世界漫游(据说是p5的原始设定之一,但真实性存疑),我们甚至可以做个美国boss,现在终于到了比乳强还要刺激的乳美国人环节🤔

但我估计尽管drate chan,jono chan,raymond chan等人间之屑比李志强还要屑,但他们的乐度又不高,只有对伪君子深恶痛绝的人才能讨厌他们,不然他们的观感甚至还没有我们的带行为艺术家(迫真)李志强差;所以这个第二章哪怕写好了也没啥意思,我打算往里面穿插大量p3内容,比如我现在写的主角团拜访kirijo group,升级舰载装备,并安装perusona模拟设备,全员perusona化(连shiho和hifumi都装备了perusona,但我就是不准备写yusuke和makoto,气死p5fags);还有让kawaii yukari chan也加入主角的迫真sona之旅🤔

除此之外我打算开辟个迫真sona番外篇,写点主角和futaba之外的其他妹子的迫真破处小黄文,完全就是为了钓p5fags的鱼🤔素材可以考虑提取出比如toheart2 xrated的英文翻译文本(没错,那个翻译是个英国人写的,里面所有能用ass的地方都用了arse,这就是为什么我到现在也更喜欢用arse,可以说是受到了这个翻译的影响),然后进行迫真仿写🤔

之后我打算写写futaba backstory,而且打算写得比原版还有意思,akechi当然仍然谋杀了futaba™,之后为了纪念™,futaba剪了短发,futaba_short_haired喜闻乐见地成(迫)真

然后是奥村(迫真)食品章节,和原作不一样,因为我压根就没打算采用p5世界观,奥村社长可以有更有逻辑的死法,比如被akechi背刺,为了掩盖haru和主角团而牺牲之类的,这样haru的行为至少比原版有说服力多了,原版™写的什么玩意;另外我打算(在强行插入一段p3m3开头的迫真戏仿之后)用恶俗手段搞搞haru的未婚夫,原版还是太没意思了

这些都好办,就是这个第二章怎么写🤔由于我肯定需要一个chief of staff,所以这个hifumi肯定要先出场,这样主角才能随便暴走(肯定也是迫真戏仿p3m3的junpei场景,只不过更加极端)而不至于导致他们团灭;这部分原创的程度就更大了,连boss也需要重新设计,而不是套用perusona 5的现有boss🤔我需要点时间构思下🤔

hakushinsona.20.04.06

草,我又想出了一个可能和我的迫真游戏项目一样石沉大海的主意了,这次是在ao3上写perusona5的ooc同人文,越ooc越生草,最好完全解构p5的原版剧情,除了人物名称外别的东西都不一样

但我的ao3账号还在待邀请,所以我要么先在这里写(迫真),然后再贴上去

I what's hakushin-sona?

所谓迫真,无非就是看起来像是真的但实际上不是,而且有时候看起来都不完全像是真的,而是勉强(逼迫)看起来才像是真的;而迫真sona5的话,恐怕就是看起来像是perusona5的同人,其实完全是别的东西,比如我作为unterganger和toiletganger双修,我八成会把它的背景设成Führerbunker, Berlin

但问题是Führerbunker不是早已经被爆破掩埋了吗,连历史博物馆都不屑于开一个,连地标都不屑于留一个?那么我们得找到另外一个迫真解释,我会选择用主角的迫真身世来解释;出于飞过来在元首parody里的特殊地位,我将本作男主设定成飞过来的后裔(当然我们知道飞过来压根就没有什么后裔,所以这需要另外一个迫真解释),而且重构飞过来在二战历史中的作用,飞过来扰乱了元首的作战计划导致纳粹德国节节败退,作为交换,苏联乃至后面的德国帮飞过来家族掩盖了他们的存在,并向世界宣称Führerbunker已经被掩埋了,其实Führerbunker完好无损,并一直作为飞过来家族的活动基地,类似于其他作品里面的飞船或者德军总部里的Berlin地下,里面水电气什么都有,甚至后来还拉了条光纤,主角还可以上discord(这就涉及到我熟悉的领域了,我一直自称discord antic master不是没有理由的🤔);当然这个设定非常迫真,但迫真就是这个系列的特色,毕竟叫做迫真sona

飞过来家族也许是个很大(迫真)的家族,但到主角那一代时由于我懒得编设定的原因,只剩下他一个人了,可能还有一个萌妹,毕竟perusona系列就是萌妹游戏;我一直有将萌妹取名XXX飞过来的习惯,无论是巨人无双还是AI少女,如果perusona允许我这么干我八成真的会这么干;由于k-kawaii futaba chan ist mein waifu,我会考虑搞一个Futaba FEGLEIN! FEGLEIN!! FEGLEIN!!!

没错,我让futaba chan提前出场了,不仅作为飞过来antics组织的情报分析员和飞过来搞德国骨科的对象,还要写成和飞过来完全没有血缘关系(草,不就是想德国骨科吗),不仅如此,还要搞一个比原作更迫真的出身;干脆搞成实验室产物得了,说不定可以引申到最终反派相关的实验室里去,原作不就有个什么认知科学的线吗,我肯定要把这条科幻气息的线搞得更离奇;另外还要想办法把明智吾郎的杀母之仇渲染得比原作还要迫真一些,但黑pancakechi离现在我能做的还是太远了吧,以我喜欢弃坑的习惯,能不能续到那个地方都难说

但我第一阶段需要完成的恰好是perusona5的第一个boss,也就是那个叫做kamoshida的糟糕体育老师;由于我还是toiletganger,我还想把toilet chan的部分人设安在kamoshida身上来使其变得更加迫真;所以最终kamoshida变成了一个在台湾教体育的前日本奥运冠军(迫真

当然我可以借机黑一波toiletwan,就像我们在toiletganger聊天室里做的那样;就像现实中的toiletwan,本作中的toiletwan在日治之后也变成了一个精日带(迫真)国,日本人可以在toiletwan横着走,哪怕像kamoshittyarse那样的半台半日混血种也可以凭借他奥运冠军的身份随便雷普高中生,而和原作类似,toiletwan的家长都像杨永信的客户那样憨批,而更重要的是toiletwan无限接近不存在的司法系统拿他一点办法都没有

而kamoshittyarse出现在主角团视野里的契机,我设定为日裔美国人兼前田径运动员ryuji发出的一封求救信,或者求救消息,反正我discord小号多得很,我甚至可以迫真伪造一份截图,如果能取得不错的节目效果的话;除了ryuji变成了美国人外,ann chan也变成了美国人甚至ryuji的女友(草,而kamoshittyarse不仅在ryuji去台湾比赛时作弊弄伤了他(接近于原作的设定),还天天cyber性骚扰ann chan;原来kamoshittyarse和toilet chan一样,台湾妹子对他来说还不够,他也元首上脑喜欢blue eyes了(手动滑稽

至于为什么是美国,完全是因为在美国toilet chan或者kamoshittyarse那样高强度地cyber性骚扰未成年人是真的可以吃牢饭的,然而很不幸的是他们都不在美国,这样就给了主角团用私刑迫害他们的借口了(迫真

作为元首的宿敌,飞过来毫无意外地接了这个委托,创建了Kamoshidaganger Chat Central聊天室(草((中日双语;然后我就又可以给这个-ganger Chat Central梗给出一个比野兽先辈希特勒说更迫真的解释了,也刚好照应飞过来搞过元首所以飞过来才是第一代unterganger的暴论

既然是kamoshidaganger了(而且接下来我打算每遇见一个boss都迫真创建一个-ganger Chat Central),那么倒kamoshittyarse运动就和实际上没啥进展的倒toilet运动差不多了,无非就是收集素材,做恶搞视频,然后到处借刀炒作了,你就是叫恶俗sona都没问题

炒作kamoshittyarse最终的目的(至少按照我对toiletgangin'希望的发展路径而言),是培养出尽可能多的kamoshidaganger外围粉丝,号召他们众筹资金来实行下一阶段的迫害,也就是真人快[insert irl violence here],比如在kamoshittyarse家里装隐形摄像头,录kamoshittyarse在家里雷普高中生的儿童(迫真)色情视频传pornhub上等(在西方世界的价值观看来)惨无人道的行为,毕竟我要在一个充满美国人的平台上用英文投稿

当kamoshittyarse被气得像元首一样大叫(并且在西方网络go viral甚至遭到了ann chan的嘲笑),并且和元首德国boy一样成为了ytpmv的常见元素时,最后的行动来了,主角团从粉丝那里众筹到了足够的从德国(?)飞到台湾的机票钱去台湾真人(召唤perusona)快打了;然后我可以扯些更加离奇的内容,比如写一个台湾纳粹组织,原作中的弱受mishima被安排成头子,而他成立这个纳粹组织的原因完全就是外国人在台湾随便日批(很不幸的是,irl台湾真是这样),尤其是kamoshittyarse雷普了他的女友shiho(wiebitte?

然而kamoshittyarse不是什么好真人快打的货,连前田径运动员ryuji都打不过他(这差不多就是他为什么变成了前田径运动员),更不用说mishima这种弱受了;然后我可以插入更迫真的内容,原来kamoshittyarse之所以能做奥运冠军,是因为他必须使用一种蜜汁兴奋剂才能拥有超越凡人的体能,而这个兴奋剂就是由我们的最终反派shido那一帮人搞出来的,他们通过这种方式控制kamoshittyarse加入他们的阴谋,并派遣pancakechi配合他录制4k儿童色情内容给其他成员打飞机用

主角团通过迫真情报能力挖掘到为他们研制这种兴奋剂的药剂师之一takemi(没错,那个朋克短发妹准备以这种方式登场),出于和原作类似的原因(上级是shido集团的高级成员,吞并了研究成果),takemi决定反水,并在bunker里反向工程出了抑制kamoshittyarse兴奋剂效果的药物,只要找办法给他下点这玩意,他就变得比mishima还要弱受

讨伐shido集团最边缘成员kamoshida的最终时刻来了,kamoshittyarse在他的豪(迫真)宅里准备搞个orgy带赏,约了⑨个高中妹子准备透一晚上,shiho也是其中之一;通过某种我懒得编的方式,kamoshittyarse成功地服用了主角团准备的药物,然后突然豪(迫真)宅的音响系统放起了youtube上观看量最大的kamoshida parody MV,台湾纳粹组织以此为信号突然袭击并烧了这里,kamoshittyarse准备反击然而他没有任何力气做任何事,被主角团用7200rpm的电动假屌爆菊并拿现场遗留的一台F65摄像机录下了4K高清浪叫视频后扬长而去(没错,f65也被主角团拿回去作战利品了)

当然和任何注重情报的组织一样,主角团洗劫了当场所有能洗劫的有情报价值的东西;事后kamoshittyarse可能被爽死,可能被烧死,但警察只看到了一具还在被7200rpm的电动假屌抽插并烧焦了的尸体;随着kamoshittyarse相关的情报(和被7200rpm的电动假屌爆菊的4k不雅视频)被开示,kamoshittyarse使用兴奋剂和雷普高中生的丑闻被披露,kamoshittyarse、日本奥委会连同台湾各个政府部门甚至整个岛一块成为了国际笑话,一大批人都丢了乌纱帽,甚至shido集团的部分人也被牵连了进去;而主角团一不小心突然喜提一个不知道有多强大的敌人

事后台湾当局接着成为了国际笑话,因为纵火案的凶手半个都没抓到,他们用一种我懒得编的神秘方法全部回到了bunker,现在ryuji、ann chan、shiho和mishima都住进了bunker,bunker有足够多的空间给足够多的人用

我觉得这样的剧情作为我的迫真同人的第一章应该很不错了

next beeg project.20.04.04

最近discord又推出了一个新功能,拥有全局管理员权限的用户可以将其guild导出成server templates,这样别人拿到这个templates链接(顺便一提的是,discord官方居然做了些这种templates)就能一键生成和那个guild几乎完全一样的guild了,准确点来说频道、roles和权限设置(包括每个频道的特殊权限设置)都能继承,emoji好像不能

当然这个功能得全局管理员那么大的权限才能使用,不过。。。

I discord guild datastructure

我前段时间在写频道备份脚本,我在想discord肯定有api可以获取一个guild里所有channels的数据,然后就可以一个for循环搞定

然后我就看了下注诸如https://discordapp.com/api/v6/guilds/[guild id]https://discordapp.com/api/v6/guilds/[guild id]/channels返回的结果,然后我发现了一件非常生草的事情:

无论用户有什么roles,哪怕没有roles,都能获得里面所有频道的信息、所有roles的信息,甚至所有和权限有关的信息

从某种程度上来说,获取的信息和templates功能返回的信息几乎一样多,甚至更多,毕竟还有emoji的信息,还有每个玩意的id(在templates返回的信息里面id只是个位数,而不是和时间相关的参数,不过这个不太重要)

所以我在想,有没有办法利用抓取的这部分metadata手动构造一个和原版一毛一样的guild?

II bruh

我仍然懒得看discord官方文档,所以我打算抓包解决

尽管我肯定希望discord有那么一个api,能让我把抓包得到的metadata全部扔进去它就能让一个guild变成一个和那些metadata一毛一样的guild,然而很不幸的是它并没有这种api;所以我们只能手动来了:

  1. 建立一个guild,并按照metadata修改其基本属性
  2. 按照metadata的内容建立一系列channels,别忘了channel有三种,文字channel,语音channel,还有category也是channel的一种,三种都需要抓包
  3. 对每一个channel以其metadata进行修改属性操作
  4. 按照metadata的内容建立一系列roles,并设置其permissions(但愿其设置permissions的api也是直接一个数字过去)
  5. 对每个channel设置permission override
  6. 如果可能的话,emoji也重新上传一遍,这个好办,上传动画emoji好像不需要nitro我也不清楚
  7. 调用discord的template功能:wiebitte:

现在已知的api操作:

  • 貌似频道的position这个参数只在其parent id里面,而category它也有自己的position
  • 一次请求就可以搞定所有频道的排序,所以理论上来说可以在一次请求中加入所有原来的parent id和position,理论上来说就能搞定排序问题
  • roles也能一次性搞定排序;另外和channels一样,排序的api和每个元素属性的api是两个不同的api
  • 奇怪的是channel的permission override用了put请求,而且貌似每个channel的每个role都需要请求一遍;只不过好像没有新建override和更改的区别
  • 其实permission override可以建立频道channel的时候就加进去,不然的话它就和category同步;我觉得category会有permission override这么一个选项可能就和这个有关吧

UPDATE:终于写完了,建立频道的时候我建立了两遍,第一遍先建立categories,然后对它们排序,然后在metadata里面替换一遍id,就像建立roles时做的那样(其实roles应该先建立,然后在metadata里替换掉id,这样才能正确地设置permission override);第二遍再建立其他channels;我发现在建立channel时就可以设置好除了position之外的所有参数,甚至包括parent id(但就是position需要从所有参数里移除,之后再设置,不然会导致部分channels创建失败)

接下来当然就可以用discord的那个templates功能创建个template了,然后就可以用来troll人了;比如:

The HRP Community(迫真

Unterganger Chat Central(迫真

某个shuann(p5的joker和ann chan)聊天室

Persona & SMT(迫真

是时候迫害一波perusonafags了(手动滑稽

multithreading discordbackups.20.03.30

没想到在缝合了包括discord drive脚本等一大堆脚本之后,我真的把多线程重新上传附件给做出来了,而且效果相对原版可以说是立竿见影,只需10个线程,拖ucc的冻鳗频道只花了28分钟42秒,拖ucc的mlp频道只花了两分钟48秒,现在还在测试nsfw频道,估计不会超过两小时🤔

总体来说对discord附件的处理,有两种方式,一种是在遇见附件的时候处理它并即时替换消息然后再写入dump文件;另外一种方式是先dump一遍消息,在此过程将需要重新上传的文件全部列出来(当然生成aria2链接的时候理论上来说就包含了所有信息,但那不够,我需要再生成一个metadata文件),然后在另外一个函数中将这些文件全部处理一遍,获取原链接和重新上传后新链接的对应关系,然后用sed命令实现替换,由于discord链接只有一个斜杠(可能还有双引号)是sed的元字符,把它转义掉即可

当然如果是py等高级脚本语言的话,理论上可以在dump消息的时候就将附件推到每个重新上传线程的待处理队列里面,这两步都可以并行,但bash并不是这种高级脚本语言,所以只能分两步走了

和discord drive相比,我还需要实现将大于8MB的文件交给nitro线程上传这个功能,考虑到实际情况,我强制规定数组0为nitro线程(即只有一个nitro线程),别的线程从1开始;接下来分配线程的时候只需要一个for循环就可以像以前一样干了

由于metadata文件里包括了附件的文件大小,遇到大于8MB的文件直接推给nitro线程,剩下的写个求余按顺序推给剩下的线程

另外我发现将for列举线程内文件的循环写在线程函数之外和之内都能正常工作,所以我还是写在线程函数之内比较好看;看来唯一需要注意的点几乎只剩下了将里面所有变量前面都加上local🤔

这么搞的话尽管从discord上下东西的速度是快了不少,但之后sed时就蛋疼了,毕竟现在它需要在一大坨消息dump里找到并替换附件url,时间复杂度瞬间从O(n+2m)变成了至少O(2nm),其中n是消息条数,m是附件数量,乘2是因为需要替换的地方有两处

比如搞ucc的nsfw频道时前两个步骤只花了可能一个小时,但sed替换时一秒钟才能替换1到1.5次,而需要替换的消息有一万多条🤔

这还真TM操蛋,不过除了移到本地linux外还有什么加速的方法?🤔可能需要重写一遍scheduler算法,直接将dump文件拆成线程个数份,然后除了需要扔给nitro线程的文件外,其他线程生成的新链接只需要替换它对应的dump片段,最后再将替换完成后的片段合并,这样时间复杂度就变成了O(t(n/t)(2m/t)),取决于sed可不可以多线程,前面的那个t也许可以去掉🤔

UPDATE:草,终于写完了多线程,无论(重新)分析、上传和sed替换都做了多线程,发现尽管sed时间缩短了十万甚至九万倍,但别的开销大了起来:

  • 由于不知道消息的具体数量,没法在一开始dump的时候分析,只能等dump完后分析,由于要保证前向兼容(获取原始aria2列表),需要重新分析(但这个也可以写成在分析阶段做,倒是没什么)

  • 最主要的是附件的分布并非均匀,所以有的dump片段就会比别的片段多些附件,甚至多出几十到几百件,这样别的线程需要等待这个线程

实测优化后的方法拖ucc的mlp频道居然比优化前多整整一分钟,就是在等那个多出来的线程;冻鳗频道花了26分钟32秒,快了两分钟多一点;我估计nsfw频道会是这种优化方法的最大受益者,毕竟之前光sed替换就花了67分钟49秒,而在优化后相同的过程(我光注释了上传的代码,然后生成了假的sed替换文件,如果不考虑附件不均匀导致的开销,可以认为是优化后的表现)只花了15分钟46秒🤔

由于我不小心ctrl+c掉了nsfw频道的dump过程,它sed到一半好像花了86分钟,我估计和discord交互的时间是52分钟左右🤔

对了,在比如死🐴管理一个小时后就要删聊天室的极端情形下,优化后的方法由于有重新分析和线程间不均匀等额外开销,搞不好会导致来不及备份完很多附件就消失了的额外风险,而之前的方法没有这个风险,而且由于给线程分配任务是按照余数的方式分配,它会尽可能均匀,最多只多出一个任务🤔

我的测试表明基本上在一万条消息以上,优化后的方法在时间上才有优势,而且会因为时间复杂度的二次方性优势更大

比如拖十万条消息和附件时,原来的方法可能要花以天计的时间来完成sed,当然此时已经和discord上面被删了的频道没有半毛钱关系了🤔

future

接下来我打算实现个迫真profiler,来标记出每个阶段需要花的时间,反正time命令的结果貌似只能输出到stdout或者stderr,如果设置重定向的话恐怕所有东西都从屏幕上消失了;我要么查下吧

然后就是想办法实现备份整个guild的脚本了,只需要列出所有channels,然后设置好每个channel对应的参数,然后就可以调用这个脚本了;主要是需要备份整个guild的时候情形都非常极端(比如旧/r/megatan即将被删前几个小时),时间真的很珍贵,估计所有频道都得设置成仅文字或者旧多线程方法

另外我需要想办法测试下一个频道被删之后里面的附件能保存多少时间,我看哪天想办法设计个实验,但现在还是算了吧

附录

用优化前方法拖mlp频道时间:

real 2m48.221s
user 1m38.277s
sys 1m26.461s

用优化后方法拖mlp频道时间:

real 3m19.677s
user 1m35.828s
sys 1m31.185s

用优化前方法拖冻鳗频道时间:

real 28m41.908s
user 16m8.481s
sys 14m10.055s

用优化后方法拖冻鳗频道时间:

real 26m32.508s
user 13m26.061s
sys 13m55.378s

优化前nsfw频道执行sed替换所用时间:

real 67m49.196s
user 33m38.716s
sys 31m18.762s

优化后nsfw频道重新分析、执行sed替换等所用时间:

real 15m45.703s
user 10m1.709s
sys 17m54.682s

优化后拖nsfw频道所用时间:

real 67m12.181s
user 35m12.408s
sys 40m22.244s

至于优化前的时间,反正我懒得测,当然也不一定(bruh

UPDATE.20.04.12:在vultr 512MB内存vps上拖ucc的迫真赛博监狱频道所用时间(由于司马cord不支持ipv6,我只能多花点钱上个ipv4实例):

real    12m16.441s
user    3m50.691s
sys     3m23.343s

discordbackups.20.03.29

我居然完成了备份discord的脚本,之前写的那个是水货,它只支持50条为单位dump,而且完全没法判定什么时候结束循环

于是我重新写了一个

当然和我的其他discord项目一样,它还是受到了某聊天室环境的影响,这次是ucc

I gaycar

garcar原名gaker,是个加拿大小屁孩,最喜欢干的事情就是在交通工具频道之外的地方,尤其是anime频道,刷交通工具的图片,难怪叫做gaycar;在我调查anime频道的历史时,我发现一开始几条消息就能看到gaycar的杰作了,可见这个频道建立的时候就受到了很多人反对;我现在总算明白为什么这个频道无论什么时候都有一群animehaters在那儿作妖了,原来这是它的优良传统啊(手动滑稽

在ucc这么一个活跃成员连20都不见得有的地方,一个人渣的出现对聊天环境的破坏比hrpc这种地方要严重得多,通常我管理这种小型聊天室的时候我会仔细审核成员的,然而raymond chan并不这样想,他出于猎奇能将drate chan这种苏卡放进nsfw频道,他当然也能干出留gaycar到处破坏这种事情来,而且更草的是,gaycar现在还是ucc狗管理之一

当然整个ucc的传统就是raymond chan瞎鸡巴搞,下面的人用过激的方式回应,无论在anime频道刷飞机还是在nsfw频道刷飞机都是如此🙃

ucc其实还有更过分的animehater,比如那个叫做jono的傻逼,是raymond chan的直系手下;某天raymond chan突然在anime频道里面挂起BJK的几十条消息,都和某件(二次元之外的)东西的娘化形象有关,jono这个娘炮最讨厌的就是娘化了,比如ucc就有条屑rule:

{"id": "667413725166305290", "type": 0, "content": "<@&279572070281773056> posting UCC \"chan\" will result in a suitable punishment.", "channel_id": "406933309189521409", "author": {"id": "223865652463534091", "username": "Jono(JSalty254)(CTzen)", "avatar": "6967c71ceccc1184bc518cef2bd638f9", "discriminator": "8331"}, "attachments": [], "embeds": [], "mentions": [], "mention_roles": ["279572070281773056"], "pinned": false, "mention_everyone": false, "tts": false, "timestamp": "2020-01-16T17:03:52.027000+00:00", "edited_timestamp": null, "flags": 0}

raymond chan挂出那些BJK的娘化形象发言就是为了拿jono取乐,草,这个troll狂魔为了troll人真的连亲妈都不要了,自己人都不放过;然后BJK就被关禁闭了,此时我感觉这事情是anime频道被橄榄的前兆,吓得我赶紧去写脚本了

II attachment reuploadin'

如果jono这些司马玩意真的准备橄榄anime频道,我估计它里面的附件也会回归虚无,所以我必须想办法存储它们,至少在discord的语境下(毕竟我已经写了那么多别的东西上传discord的脚本了),只需要将它们找出来,重新上传到一个在我掌控之中的频道里去,然后在消息备份里替换掉链接即可

而且保险起见,用webhook上传是最安全的(但用普通账号也没有遇到过被橄榄的情况,我从18年搞futaba.sh起就用nanakolover往我自己的guild里面塞了十万甚至⑨万张冻鳗色图,都没被橄榄),当遇到比8MB大的文件时,这部分文件就可以用nitro账号传了,既然是消息及其附件备份,我肯定不会像discord drive那样弄分卷压缩包这种操蛋玩意

还好ucc除了我外没人上传什么大文件,所以不会出现比我的nitro等级支持的最大文件体积(50MB)还要大的文件

为了能在discord返回的消息里面找到附件,我们需要知道每次discord返回的东西其实是个json数组,去掉数组前后的方框后,它剩下的是以逗号隔开的json对象,一个对象对应着一条消息,将对象与对象之间的逗号变成回车,就可以将消息分割成行,然后直接存储或者用for循环处理了;问题是}, {不见得是消息对象之间的特征,有时候它还是reaction列表之间的特征,有时候它还是附件和附件之间的特征(因为它们都TM是数组),所以我最后在后面加了id和type之后,它才终于能够只分割消息对象了,体现就是一次抓取消息最多只处理50条,如果计数出现了51,那它肯定把什么不该分割的东西分割了🤔

由于我们成功地将消息分成条了,除了获取附件信息外,还能精确获取每条消息的id,从而断点续传和增量备份也成为了可能,前者只需要在第一次抓取时设置before参数为上一个文件的最后一条消息id即可,后者只需要搞到上一个文件的第一条消息id,然后在脚本运行过程中加一个判断,如果当前消息id等于这个消息id,直接退出脚本,这样就完美地只处理了最新的部分🤔

至于附件重新上传,我不清楚怎么可能,但discord一条消息真的可以带多个附件,它们会存储为一个数组,用grep将数组那部分提取出来后,去掉数组前后的方括号,然后将}, {替换为}\n{即可,这次里面没有再嵌套数组了,直接替换即可,然后写个for循环处理它们

按照惯例每一个下载的附件会放在临时文件里,然后用for循环上传临时文件夹里的文件,尽管我写了for循环,但它只会被循环一次,毕竟里面才下载了一个文件;至少它比其他的写法看起来简单很多🤔

bash里面没有do-while循环体,所以只能先do一次(curl抓取50条消息,按照设置有直接抓取最新的或者抓取指定id之前的),然后进行while判断,循环结束(没有新内容拖)的标志是discord返回一个空数组[],非常简单,而且也符合逻辑,比如对一个已经拖完的dump实行断点续传,它第一次请求返回的就是空数组,使得整个过程都不会开始🤔

ps. 用正则表达式来处理json,尤其是像discord消息这种对象套着数组又套着对象的json不是什么值得推荐的做法,正确的做法是调用专用json解析程序,比如jq;但我的所有discord脚本设计时就是为了能在ibm cloud这种什么都没有的小🐔🐔上跑,所以只能写成这个样子了🙃🤔

III deployment

实测拖anime频道花了两个小时半,mlp频道可能花了半小时吧,毕竟有大量附件重新上传的过程;但拖general和pictures频道时我没有使用重新上传,很快就完成了;现在我在尝试完全备份nsfw频道,毕竟死🐴白左raymond chan经常威胁要删掉nsfw频道,而且ums的nsfw频道的确被删了(毕竟那儿白左至少有三个🙃

至于dump大小,anime频道大约有1.5万条消息,dump有8.6MB;mlp频道有1478条消息,dump有966KB;pictures频道有两万条消息,dump有12MB;general频道有17.6万条消息,dump有87MB;nsfw频道有6.7万条消息,dump有38MB;考虑到discord消息高度冗余,压缩起来非常容易,哪怕包含general频道的dump了,它也能压缩成两个普通用户能上传的包🤔

对了,对于原来脚本就有的重新上传回去羞辱狗管理的antics,我给它加了一个greta笑话生成器,用来取代原版里小号可能用不了的嘲讽表情合集;最经典的greta笑话内容是两个萌妹和greta困在沙漠里面,我写了一个数组用来枚举萌妹,然后用随机数下标选择萌妹,这样就非常的草了🤔

function gretajoke {
    cuties=("Ann" "Chie" "Marie" "Yukari" "Fuuka" "Futaba" "Hifumi" "Riley" "Cosette" "Alice")
    cutie1="Cosette"
    cutie2="Cosette"
    while [ "cutie1" = "cutie2" ]
    do
        cutie1={cuties[((RANDOM%{#cuties[@]}))]}
        cutie2={cuties[((RANDOM%{#cuties[@]}))]}
    done
    echo "cutie1 chan,cutie2 chan, and Greta Thunberg were all lost in the desert. They found a lamp and rubbed it. A genie popped out and granted them each one wish. cutie1 chan wished to be back home. Poof! She was back home.cutie2 chan wished to be at home with her family. Poof! She was back home with her family. Greta Thunberg said, \\\"How dare you fucking call me Greta Chan! \\\""
}

草,我发现它这玩意有时候会出500错误,导致脚本无限循环;所以可以考虑写个迫真异常处理,如果500的话就不停请求直到不是500为止,当然这玩意不像py,每个请求都能返回一个对象,里面可以查返回码,好在discord的500和它的空数组一样是一段固定文字,请求下面写一个while循环即可,通常情况下这个while循环压根就不会执行🤔

当然我还发现它一开始的sed替换写错了,导致保存下来的json里type后面出现了两个冒号,不过这个好修复,由于只有type后面有两个冒号,一个sed -i就够了🤔

IV antics

我在ibm的小🐔🐔上跑起了这个脚本,跑的是只保存文本模式,感觉还是要慢一拍的,每秒大约只能处理四到五个消息(与此同时我的vps可以一秒钟处理50个),可能是因为它的CPU太弱吧,毕竟它处理每一个消息需要调用好几遍grep和sed

但至少我可以在ibm小🐔🐔上跑,这样我折腾的那么多正则表达式可以说终于得到了回报(迫真

V assumptions

我猜测无论我疯狂20线程上传东西,还是不设置暂停时间地疯狂下载东西,discord仍然没有橄榄我的小号,而当我用web端时我的账号却经常被橄榄,最重要的一个原因是discord利用一个叫做science的api来监测部分行为,而我用bash的时候压根就不会用到science,discord顿时眼瞎了,失去了橄榄我需要的感官(手动滑稽

当然这是毫不靠谱的猜测,还是用webhook保平安吧🤔

接下来我打算写一个更加强力的玩意,用多线程来完成附件重新上传的过程,已知附件大小也在消息json里面,可以找出来并按照大小归类到某个线程里面(一个nitro线程、若干个webhook线程)