Misskey API の sinceid と untilidの 大小比較が全く分からないのでコードから調べてみた

Misskey Server は TYPE SCRIPTで動作してるらしいので、GitHubのコードを参考に復号してアルゴリズムを調べてみた

geid
どうやら 種別は Aidらしい

misskey id checker(TypeScript) | ブラウザでプログラミング・実行ができる「オンライン実行環境」| paiza.IO

オンラインで試せるサイトがあった。

export const aidRegExp = /^[0-9a-z]{10}$/;
const TIME2000 = 946684800000;
function getTime(time: number): string {
  time = time - TIME2000;
  if (time < 0) time = 0;
  return time.toString(36).padStart(8, '0');
}
function genAid(date: Date): string {

  const t = date.getTime();
  if (isNaN(t)) throw 'Failed to create AID: Invalid Date';
  return getTime(t) + '00';
}
function parseAid(id: string): { date: Date; } {
  const time = parseInt(id.slice(0, 8), 36) + TIME2000;
  return { date: new Date(time) };
}
const tString = '7tcw9o2z38';
const date = new Date();
const gotAid = genAid(date);
console.log(parseAid(tString));
console.log(parseAid('7tcw9o2zmf'));
console.log(gotAid);

#include <string>
#include <time.h>
#include <windows.h>
using namespace std;

const long long TIME2000 = 946684800;
std::string toString36Pad8(long long data){
 char s36[24]={0},res[10];
 int k;
 long long x;
 do{
  k=(data % 36);
  if(k>10)k=k+'a'-'0'-10;
  k+='0';
  lstrcpyA(res,s36);
  wsprintfA(s36,"%c%s", k, res);
  data = data / 36;
 } while(data!=0);
 if(lstrlenA(s36)<8){
  lstrcpyA(res,"0000000");
  lstrcpyA(res+8-lstrlenA(s36), s36);
 } else lstrcpyA(res, s36);
 return std::string(res);
}
std::string getTime(long long time) {
 time = (time - TIME2000)*1000;
 if (time < 0) time = 0;
 return toString36Pad8((long long)time);
}
typedef long long time64_t;
std::string genAid(unsigned long long date) {
 time64_t t = date;
 return getTime(t) + std::string("00");
}

long long parseInt36(std::string s){
 int b=1;
 long long r=0;
 do{
  if(s.c_str()[0] > '9'){
   r=(s.c_str()[0]-'a'+10)+r*36;
  } else {
   r=(s.c_str()[0]-'0')+r*36;
  }
  s=s.substr(1,99);
 }while(s.length()>0);
 return r;
}
std::string parseAid(std::string id) {
 char tm[256];
 time64_t time = (time64_t)parseInt36(id.substr(0, 8))/1000 + TIME2000;
 struct tm l,*l2;
 l2=_gmtime64(&time);
//_localtime64_s(&l, &time);
//localtime wsprintfA(tm,"%02d/%02d/%02d %02d:%02d:%02d",1900+l.tm_year,1+l.tm_mon,l.tm_mday,l.tm_hour,l.tm_min,l.tm_sec);
 wsprintfA(tm,"%02d/%02d/%02d %02d:%02d:%02d",1900+l2->tm_year,1+l2->tm_mon,l2->tm_mday,l2->tm_hour,l2->tm_min,l2->tm_sec);
 return std::string(tm);
}

int _tmain(int argc, _TCHAR* argv[])
{
 struct tm *tmx;
 time64_t date;
 _time64(&date);
 const std::string gotAid = genAid(date);
 OutputDebugStringA(parseAid("7tcw9o2z38").c_str());
 OutputDebugStringA("\015\012");
 OutputDebugStringA(parseAid("7tcw9o2zmf").c_str());
 OutputDebugStringA("\015\012");
 OutputDebugStringA(gotAid.c_str());
 OutputDebugStringA("\015\012");
 return 0;
}

VC++ に移植してみた

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です