From 06c1076caa5e71af3cce84e633b45b1591520b6a Mon Sep 17 00:00:00 2001 From: William Harrison Date: Sat, 1 Jul 2023 13:16:48 +0800 Subject: [PATCH] feat: update sentry parser + add cmd --- src/commands/dev/sentry.js | 36 ++++- .../assets/sentry-glyph-light-1000x917.png | Bin 50925 -> 0 bytes .../assets/sentry-glyph-light-400x367.png | Bin 0 -> 15402 bytes src/sentry-api/endpoints/post.js | 30 ++-- src/util/sentry/parser.js | 136 +++++++++--------- 5 files changed, 120 insertions(+), 82 deletions(-) delete mode 100644 src/sentry-api/assets/sentry-glyph-light-1000x917.png create mode 100644 src/sentry-api/assets/sentry-glyph-light-400x367.png diff --git a/src/commands/dev/sentry.js b/src/commands/dev/sentry.js index 0b9a350..d9e659e 100644 --- a/src/commands/dev/sentry.js +++ b/src/commands/dev/sentry.js @@ -8,6 +8,13 @@ module.exports = { name: "sentry", description: "Manage Sentry", options: [ + { + type: 1, + name: "capture-tokens", + description: "[DEVELOPER ONLY] Get a list of all the active capture tokens.", + options: [] + }, + { type: 1, name: "deregister", @@ -64,6 +71,33 @@ module.exports = { return; } + if(interaction.options.getSubcommand() === "capture-tokens") { + const data = await sentrySchema.find(); + + const tokens = []; + + for(const token of data) { + tokens.push(`- ${token._id}`); + } + + if(!tokens.length) { + const error = new Discord.EmbedBuilder() + .setColor(client.config_embeds.error) + .setDescription(`${emoji.error} There are no tokens!`) + + await interaction.editReply({ embeds: [error], ephemeral: true }); + return; + } + + const tokenInfo = new Discord.EmbedBuilder() + .setColor(client.config_embeds.default) + .setTitle("🔑 Tokens") + .setDescription(tokens.join("\n")) + + await interaction.editReply({ embeds: [tokenInfo] }); + return; + } + if(interaction.options.getSubcommand() === "deregister") { const token = interaction.options.getString("token"); @@ -139,7 +173,7 @@ module.exports = { .setStyle(Discord.ButtonStyle.Secondary) .setCustomId(`sentry-capture-${id}`) .setEmoji("ℹī¸") - .setLabel("Capture Details") + .setLabel("Details") ) await interaction.editReply({ embeds: [registered], components: [actions] }); diff --git a/src/sentry-api/assets/sentry-glyph-light-1000x917.png b/src/sentry-api/assets/sentry-glyph-light-1000x917.png deleted file mode 100644 index 8ba24b10a5d204d75b59fd45a435e3817f572585..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50925 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 z zY^Zi|_Cx%wN5J<>yV^}ci)sonX^V~33gZ=2O{#4)zRI*nLk1Y;Dva`D+>~YFn(ciI zZs+VmAfges0N?zER@vgXz-rZmnYlQel#oNNKGbe6qLIx~mW=?!Ko5ympF)_(3aggVNu`%eba%eo6oAc>&ln zdVb;hKYPx~I6IrF=3>0Z5lkts&=}*Jsgohvvp+6G6~4QjbiAW(JXX94x7iF}Yc3Md zH43?i+)DC6SkrGAIjE%lE?JPQ! zOnDRfXL6V9Y%wBayH(QzAwoG*aNf#idCqD(?XCHY6Z1SeG>y0XCoXy`mx)%OFjmo>DkG`Ywsco^4u{_(CD34@15zk zL?7q`CRYn$nUtOPZ<}0MHx()Pw`d*-1v3X2xc*zzZ%b9Y0yj2@_<4!oNo&pDYs2Xu zW=i|u!SLqz@^X!*>%(yeN_5t#Ha@7`|3i@^FlUN0MgSVEFWMB3R!k$Vi_=s~fp>im z-c?EFYQmN9R{#QYwMj!wd@coRk7@kpx%9Ta`?bq2f1pHLv{>L<`yxCk2tRsmyTNhs zus7qQid9Rq;QNh)mK04y9&fhtUo&Z3w7E>EZq7ojlYpyY$6wP6;Sc?pI)Civxg@Pq z*K#TyMNWAs3bh|3Dm+&^#OU)c9YI{D8J5{o2AX20j9&0Za&Es#wzg=@B90YhzO!Ne zMB;vAokpgf@NqlCpwMKxL%an(-(o`TOW|$I!6}(nT2z&~M{Lk+NvnW8BTFeAh60kg zax+9^5tx$3uq!f!rA31tX#Iwz5P{ClFF*n0%@49&d1g%oFBQ6htF1&ME5B|DASSJ? zdv^xTz%XpE(YoyK&+~pz<5o1wuE4#9+@afSimNZu2NsZfH-M~ZTgdrOiKk=wVCR*Q z`JwAOVV&Ha=RqFT{uJKdL9}M+$LG;E~9p|p(i5iwFtAiAlbq)HR!t~+x?!^x6tM0AHL_Xm0 zK0PIhXSGlREKqyA?yI=fztdzb%<cTGh89>q|n zPN-?@7=?x&okopnoCF@6obS$78JK|DuNCr7GB7Y5MZ2&m9=4FkJ9GxHG?hUAfSxTV z+YX@3?B4`srjyg2f|xMA$@j{fm=&n*`J-aH{5b@U-}*$-&>9gb|FvUsu?UFlxy+w@ zFAvd{Lj+HK`_shOng;cK?pqgIS|7Rz&~hk8UGM{E^eKvpe?AYoMGI?5#e^Lg|w{S19|h5ir7R`eyD& z_IsV1`OvEB*5RFY+0P#+Z%ngAPv#7;y$VWF_-sHR0v|fnCK2h`kWXZa3|Ra40>4@1 z^wAo*;Xkm3$s4X9>-PXDK$sM=_ zXQD{u3bT znm7t}3%ZJ63}nW!2^3TdB$2N_5Y?4n`Q+mYLb*9eS%WpCU>%!CYuZ;2AQeI#B$Ei7 zV=?jyAVT?|RY%^Z%#=Gf?=35*as1rZZhPoo)hSNt&k|j@-lAbEk&uZu6c%N9dbxlU z(f_^ZKpv#sG`xNu=lbX4G65ms<>b?EInf_kz%-353uZMU;7I>n5 zN;t^k_*pATa$DQ=Z(UIJJ{j|z@Un&DhRF@*Vn+mkIZn=<%c1~CZJU%-t=|M0ktiJ+ z_cLAY5!YWPO@v1L;*z6+<8GezG=7g==c)I7f813q>P!bEKmkV?xq};<7qIo1WATv7 zzvL2q$+7q6Oh&Wb_9rV;*DTVx!I57`{?GAo$rkxV6gX_c5L3cp4UON{*9rl1ZH*;; zS)DP)HcYPm`4NYpL{I;4C)2^Vy5m4 zaqY=l2b9(qd9ZYlK{$B^Dg=(3BDZygW}nosFDLl+Gg2vN4v1-LM#xmo;`&Z)X0ocj zWZ0sISo!vPSw8$NxISz9*B<+#5f-sApyQT~n|Px>e_v5Yj-d^9|3F~s-hJGN zz&el19&XCqs*%4n9Zvbad#c+={xC0Z@lzz{c%(uIW>8? zg>oj$UGUt_bW^0dMPQ&O&4i6aIPwm94AzsD9PD|JG{x;LRg( zEH0=B-c0`L4)nU|!>>w;tij125&-|Nypi1cQwqkM0nGK~$TtHOMb>1vAzW;Ymws$9 zumyRzUvbbbIHtB$VT;T5{fr2qYI`8We;-|@3^Dk9Jy9YC(3gU$aSxIz{jT`Z17wx4omP9n^0|M&;Vu7?AJqLKEl)glcpqFbV7Jmf0@NG*{JgPN~ zm?chKg=7}Y1#ziJ8TQwP1%@dFOg}$sr?dQswb?awvw`-ZAy?yTED}Xmjtc{~XtoVb z)gg)^;-B58!tEqnnNo9QAOT}=%*z3Fx$>5gAV$3NIaHVXJ~-qr^Hf%(!+9vt)LnNw z;`gJY&#m($BWE-os2N1#Ct(*R4eP$OzXt5|H+BCa(}8(tVacV1>!)n4LmgdDnIjx0 z1@pY!J^10AlBG=@C4tS3#YqoocnR!~PH$5Pn*nN|dZ^~+?Efwr4vd)W!CwzJ%8U$f$(s}vvBuYS)WNcl4#wxEX@%Yhs_vVro7Pqwc;5okfm^VM z+}0gmahrahRqd_aylX7t&3Jxj;#S0W)9gdzn%LuBc=PyMDs_@)3J%&`M}AQRA*6Bp zjUoMXapP0{w%F~j>_FW+`|)cg=y`~I@P~xew-Sn}HdHI{Z{|(gt!7Ebo90E{d=cBQ zz^Ty!6f0Zep>BAK`**VEBuXL0xl)jM5!BLa&?=2>)bS06t5s}EXYfV?A0a6h?i(&V zbf9;b>ywSef;Ls-;yppAZy8Y`*57C*tVhA_)wie!?2GF}DyYjrBb#cUf zMOVQ)5B_!U&UKvJ+qTBF%oeqM821hamQ4^7xak1@3P{#tLE0{~Q-bD=EY&9TMe%z$ zDQNQ}V+UU5kOe3ILa@ob7sp!SCqJHdDQdSW`OuG6Rr?FKkYyuld600~8hR_`Uo84S zibbOmc8W*_P?+DV@Eh#dS@P&$4p1gsq*tEcD*401J1DknaBe?>#A;vNG6Jd3{hq#@{P@zFO*08 z<=>F14yT5aDNfL-@ZA-}#BVeH#NhP?1Yi>x4mT;7k7Ni5XFyv-3l!Tqqf`R^+O7hL zv|Wdj0I@#c1>0mWqgY0TN23N@OEezH{5@6{da!8zTMW}u>U0KUAhu)-i5iT3@SHQ{ zV_$dnBW>2^zzd+}H02G9y@>Sy2S`l4{rXOEL#B9%ImiL18&8Bg$*4(7s}SCqFyDQG z`m^TrYP-eTSe)j`Z;0@bdTYGSrvpQF z^E6_v+Ed}+M0_%|YIZJa9v!t$?=jE#%7s~hYNjUhk!%(*FEc0(bU;0O6fgLTm06*^ ztNuCvHYuPeEd_Zne@ek7G|}gbhCya2#1RTE^IZrtJJw)$W&IR+K|tl0MpzSff6Z%c z>ijsj>!m&oxp`$zK1Tj*BiZs!S-I8aG8sqirb`44dDS&%-Dd&dCD~3W&ta*mwc50% zDC`a-u|t?+&u7=yX))QSWNNRlyu?iuTV>Zj_wY}hd>w7 z(v~&9O=)=(Ge}lX|KgxpjZZ*VMO&e_#Hh1sTx#*#SGyE!@pT z-6tNAK`XUN=KIW+1`<0THRjE6l41A1Dei0}bUFD868fd-uKvQ}+S~uU{oo$Qe=|iZHeC+qm)xRMECC*OAp{fF|+)=wXmKEhY3piz0b{gINl`}$n~#eNd90Rddnw- zdUFD42q)#NPj3~oQ0ioeHHw+U$B2)Yeq2R}JvOn7Yd|!&jA@*h#qC=RRLc|WZ#~I% zGsA>q*2U_%koC52G1_Kz_(%X!s2a~%?9U<8ZtH^%cz7C#uwXKa23<^mS}?ax$qdFJ zb-070Ti^t(o?;~!#uX;GWWDF9>@})Eua!4>365hevmPe)Iq=|Yx+fjtjuD&`w&~|; zYF-oaZ`aU{&gzjk$y30<%?z)ebVY8cPY=XmC6OUe+ZMtGt>$sz5`Qi|X~$|2<`!oU z#4k!=c3@_~J@L-|G7%1#{QK(3BA}t`_jQ`>>8te!H`T4V^%uW&k%p|``@28aPG+HQ zkd@4N6?pGOKWAc1&$x>5;7G^U4WX&~jb$FnhD>O481Fy?&*qHr0KjM6b4=*J@OcCi zs^F9Gbqo-0a>A8w_oM+Nnw6p=*&vF<1YI$V2G!NM94!8ganq+6zF783MZ(|{uW{^G zRaU3@WQ%AAjMhO{ur{Li#@X1QNr3v--<%_CUj0@^0mrSAzfq?*-ckG!{$IoX-;08p z%G1)La8}bvc{v|+tWDnFn2b==DKK`L0qx zB9uVo6(jPc)?vi}5BGge?ae@uk@6rnRT?S5N&uM)Or}!-sXg;+Imp+h*yJ}XshSC! z?dsQGF#ZJaw0V>sMcr@A=Hjdx;j~J2({}9 zwOoL~qG@{sy;#4!-}2J(De+85EGghIgWdA^{GvGng#?@MTr1&@-AiYVpu}yVM_D)c zMW|--vL<~Nr7jY>ysr$TP++u9jW!ntBz2M^R+7tQ)inI3qF>C}KN|w(bJDvS3L{eA z>A{i*v+L$SX3`1N7&oD5@mDcSW|_qF-WObe5rPDNoLeYHs5v^5K0C5><&F29En0%C zkJPzFY0SM6zpu(njl-W z87j(iFndTm3g!KOI5FL4YH(cWshKrS{mk|oO2Zacbs|}4IJE5jab3ge#_G}-8|cmL zg*zQD#cG|_#UBJk=8m!}UzAR?6xk;;e@3OQ5Aw<>Qkw!yZ0LmpQz4848nW05|o~=6sqU* z(!`OdP;sZOF2qU z3B2{DSp&a~M1&@)y)>-L!8M*EilVAp95oLblR*Y71z~!fqWzy50vCGYlgHg$g^I-b#(Rdh_Gl)M#tgFv}|D?FYDH8H|(Plc$Cr8MSyB z!FDk+w<`-3LyAt~D}UYK>`aN0(pUkBYN@!Q-xv?2o;F-3dW@xwoIK!IU#8DsE9^hc z6bo~^QRj4x6z^cX~&JQ3P@+&%_>z%&avN(bG@7Wp=JZEiN z`+n|x?BrI!`D0#ZkY$6~K2P7@71L#S^OC8-A^ofVR3=0)sc>yd* z?)hLoe4c)H5G4QKzjSI;nIAs_9^gfMe+fK-Bo|PFZ0-tLe!ks)Q9~#BF!VEWY}nc` z^#>p}rltB*=5+R@u=FqSfv7Uzz5Z?D>r;Sfo!xIVsFu-qU0{H$H-0_$x|_@nkk${} z*ekif>m~tA&E7`EN1?5ZWpljdEl5&a3@v7Pr?bI&^tZmJ=t&k^4a`D+JtXcpREi4J zTRUVuN#k?YfNVrr+Hr`D%ikK^v)fRl-J(pF2fKw=eTG$TS$Sa>ge$snxuTnBazrh& zuF$su0PlHfqo_v+5opGh-6G?nuj7BU031$BwEzbxJFSY#y5ic4qnKPHCeYqPM5a6M zkzY=MI2D9l7Xq=mfyZ$3qU!u9I@2$ah3f|Q)f9Wpfdnd%RoghkeTY=hZdtUVWXUCTYE;y^^$QMr`cw z`!X0OG01E*-|B2e;H`21#kR*@O;oDGuWbw|QM8#LLQecX(8rK?XwJ$HqWCqw=p?WoLU($zMoS7jE2HW`MOpb|#UdTA2N5mnmR%7(V%X6?_Jf~-ajd62!}#70(7ZiO z*nHRy^pCc15@Juf5{?1-vQyaPXfj_7nFdXX;Dc3GMxbCjwR=My*O2CYp0L)KCz-m3 z5TTyAT)fDs;v{3Y|AlhCiv5yv=W<3+Uw&I~BC+Z_LWGYGr%(3ASTk+eA`t5kpfU?O z6(Azy0~nZ%#TUa4sZqPr*T;q+eSyFoK^28}vT)psQqTezvHV8l4QcNu;(cy@svMk0 zucu8UkK=4H1)3k9h(spvtS%t>6I32wYsvx+Me+kSjiMSWbeRiX>E4RDw#{Hzro$`iH7Q0wRiE~BT<~mnqPxhm zx6>0c{8qr(6zUpY&bjlF2IGGV=vw2?QFj{L&mVVRQyJh|PIEVXBGiXu5!rmC z%to^D2{%Vphd6N-tru~JD3|9t1DAz@Etr)mh01bOy}SO^k-8-DBT$He{lTr1F_iys zDLoRn5LCgsJniAi)Wr!*2}(LCzkcDM2q&@N=)*4I$)|U>hhTsuYI zUJk)=!4iMJ6r)L`<(lM0a68|JMl=P>XfQ3*Z)iT}@v(#L7f8NDvj%i-XCU92!tIea zXz-Nsl1Yt+0us@9&yw4}^ImKOS=h8n#?Yc4_}u?7cCfE+)cw0(Wh+~xKS@0R6Mbq_ zo~p7VW+Ik&z2nTESKxFvkhQ&R%((nk)&sdm_#|l_5Be40*i3y1nmY$z0T)Vebinbz zy~a>EhPcs?GwK7wO_6cuWPJ+!>1I@XtW^`sRnF{7qFdA;VrbYl3_i!XP~l~afYCx91-mlGaqh}P@w}P8Lz?W3 z7Yo2g32bvJ>T-6Z0FwR6X`V{wL`m10SS1s;vGd=4vk>Yz;?jKuG0M;tp8+INKMhF62FW=Cee*9|UxaQpD(`>6U_Dk7;TbLj1&r3QLO%viJd%;?hZ?W#v# zd0q#6N+hE`;R+GKjnKx3uH62oWEe(<522?L>$@!eB682zc3b2Qu2uup-(ZS$lndrw zaXGjkmp$I*#})(b;Gh0`#suV)om02r0ZVu1fm%L>va_|Fx7p&=i3qQixlWR=BG#lz zO4iGV9%qS1P1{?fRg+hs%qGQn>S??n6eABUDYjf;XkCpiR6|oa%l&R6IiZTii zI%iFnHr!s5P!O<`{13mK%P09A*AoC`$)Q?xYTjUu3x0!Q2{&wRz6HPPvVZzdt~qB0WU`JVi+Oq5a9}t2ffIM zu9s|0uW?&P6HP*@;%|eZ-Y4Oj-IoDeRBh5>h)yNvJ05uCh^Be6L$PV!wQVw4-Os>U z2C_lJN}!UHhsk&mQIlkpk;a{zLHcBLA~4yYkm(|ri?2au7X6o*Q;EO+WoC2&u+!3yo+liw&USV+E;3{4@codC z*u2whHsa@}Q5$yveQF-jf8$ED?lMTG{irp`#0{9{Q@30uu|-EadT{z;ekpCR3z}YX zX4GT|ce0r|mTJ0ZzbYUlKkEGp8*byYMnW`S>Uw-WmB1dI4ACmm_igTKR0u1P7eO`6u_|Ry*?ch~p zk@a>35pV>Emuapsh^8`tz1W2-2Cp+5Km9RABB06_PXFR3X*JJCAS+v1=oKp?&TdKf ze0a;GFDjzDl@L<|TH3axou-fMePjgQ|3=vn7gosVoAR>-Pwg2r?kAm0-=u&Fi51aq z9P0ynVS`sDw=Iu5sqE3&iitZKdW!_(A?^JGmdeg%xem_CgDyXmhV_TeJ_EWCOL8*{ z`8Z-I(5p;KfKt->&Qz?gh!BezRpd==m#!O)ORXXV-&@xFxm3^a2alR#m41;wc(t1U zTYR$_%{4UKT9`7Y-N4i~CgjY8TJb{ob3AKp)CBD~R;Vuqr9HxQe0}XX+sW1&*Uh|& zAn+Of{S#OJqEJTbT}A>Le`Fz_L|P5vgeFLAFTl)89AA{Sa~(JqpVIJwuwca^1l_AY zqPT8a8D#f5&W~P9wn~y>*C$Gy`PSkZFV8Jf`2SjM{*LM!iBfjIv7P}!#%$kj&z(SL zkiTVZXodon_(NFRigOJnrXzs)DT6SzFthU3>T0FmuMr&rDjL!l9jH#)p3*q!(6saT zZ8cKJl9{7CR;02_Z)=(9>9~(9*j_P#k&kkz)il_7YBHcC%3)(@E~;*uqyZ6Vvl=r- z*XG=;7_ny1q)5m)8sZgnz62>#FqDsWSBj{;{T69Gu$SUXja^HY63^LPf{EZcwoum8VLyRDH$b!3UI5lkPhR28Wi|We zYME!iXFiwxr!UV3qXi$Ws-il`zpIBE`76c;M#M$oZ@d(qoHyC>hpG~38@qr_WZB4l zo5LgW*B=^C9=`>=Lt(_A(-QIu2CRB8`zZ~?)btIt@8@%>D-A0{^l`In8Mk!EN(R|) zvxW4fy?89LdKNMARPRRq14J1W_s@Gg(tLrp^W*F@Zjp+DCn`EL=Z`fcF3kJufZ$UB znMq#XEBvIC>+p(d{to;*sSDefGWG??Vm!#-1c$5pAp?!VTjXnnolk)usR*7sM&?8l zlaKT+j`ZMOyo#?66BKoPTI}`F0UGMAvw;P;+dIrtS924h=W!0#?gLQAi7I}XZK+nU z{%9_gBp_ET_BD62BDFyc=lc3VSy9|gIMM_m?GohrluIavQY%?_$?PNplf<%4Gi?uO zSU<{_UP`E~e&^5k^zSb;rZfU!b)t(8J-R;$VMS|OnCG}Hek6kExYpo-OgszfyejRN zy>XxdkcaMwB!1FHsHyPP#)FdjLR$!@-pGz*|EY{vV*WlWQ}-cG_1diAE1{8hbc9W& zl0~GDux-avZrOJ$m?$f=T6LgqE8Umf?o=0v;|Q(P&+i**D@4;<{mlbty>>|c-3RjO_U;7Dgf(oH;IZi(Vl ze~!orOqat2Ql3{9X;TmF(w}Q|@>6V&>S;%uB<5b_xReIc*T)x12J<*2${9e7oo(LZ zz$V}hRq`^Qj;G?k!-CJWNqSv&SDy?)q`M)EkSY=t_`~^DV!`5E~rxa1q|LvCeJ5W7e?D&&VR1*d_ ziy)5ZT=i%T1OiFL{wCHXZPGx6;Fm*bbZ9kd`nq|Vq!j>+J~!IO80Y(ikTaKrf}^=w zwE8PK)g>%#Q%!{`r_hIUQn)EY1H<5Zs} z(ClY6|1q~Z(|G^Gq%KHHFK6qg)f3lq?SJ-T%sR&-JDIdx%$VnI}PtCha8c+*vcat zBEqoF0-EDpr*dvc28pmO1?zdpnQ^P zrzUxU3J{PqkJa_FC0aP1FeU|8_F{};teSK77_mD=&jV4p$8<+OHoml8e6n!nlW6Mt z)udq2vz5cL&OmWvW!0Fr(qBj@3Zut$?e1L(PXXB_&-?G|BcK@5hrJ02m$9so9Kh=| zu(xR^eRee(Mk2&KBy2xd0;z3(z4iUYjW55&)ElG-rN+n7ch^n~P)56rf`=hDEDlUe zu858diWdE-Lbn14l=(MUSBF|7Q`PImfW_!Xs%hw?P;y>qH?{f#mZ>CX8cfWxcn?H& z_FNV`kl#)Rh#W4{9Q(64S~i}$-hlr1gU@N8-r;C70yV1aDm$V!*8EvbW*d=2F8<^L zALBu`Nx6_g)%NpOant3Qc-vEPfBdEa1Hm@QZt<_MgW|Z97iyVwk?~S z``ZY$@HRV8D?$NCW5_>|R*Y>@0+`ehl6JInGUVvSHTir|S-%H_g}_Clgv~k($s{UX z$;%?k-^qVt9$e$bT%_2%TU+&4V!Rmq@T21br9i5$Jl2sfWjF#4CJVo+KTEMk?~`Nw zU##9{8aqL4m9g(%8pGjzU~bmjWcizyt}NA?{e>&0>#{DY4GcmHf?xJ|5f_EO_w=Ul_xqOX$aKcQ^id{qV!EI;xaY_MDs{@5H%IS}PsZUcJHJ~tZmV^0 zC@oJVjS1IQ9b}?}f$JpjGY^Xckv#=m#`c*?ps!L4u`ke!Fdd0^gi_wjFU}ba%?mrL zK=h9LzW*^jm_HUByilRFwWZs9)>UVq1)>vSK-IY;+*}UJQ5)}a{?j6~E*{_ysgsjC z>})@G$kL{O2)mWBfnU?6o<51(fP6gIl6q<$?6n0ZZ|gx-^a@vwVE`&R>$KX-{O&i6 z=c(5^On82lP8Bt9190hGr`gjnHf+j0h$Q~+pz_DNInC8Po4dt)$1Mo=(h=8b=Z3bR zXgiz9ajb|nKiXRSA*>^Jw$15k@17B2qxah__glDQICoe2hn+;r1}RE^-6$;n56m(v zZe}6kxD+&kU)LwbJHXdSVr;9H_^B&E>I1K9nSCP^(U?HQ2~pN`o*)7GB|leA)>9u6 zTJ(q^(U%`vL&2VmneIkM zv9W-(LI%=GGCEl!o)1LP3E}J9jHU+qGE4t@_wB69=+-C)vkca0M5OkpGTG(=?d@IQ z@CF#-q25LhqT_zJM<$pmK!G`+YnkSy_CJjg9W>O^%#TUKsb61yf_L4@*`S=k!((!^ zykp@ZPWI*lt}q2E?i+)>HO*$6K06ox2Ab|4UnN|yQJ~%4FdDFf)-T>Ql*BSi3ToTenp0IWkF!WAMX*gU$di z#Px|_tS6R`NIM-{?+EJd(bTca%<{=^#ia=^C3eiZ^T0jQJ*K5T7P%h$^>!AxY}0J7 z_hq29IH@466$fJLI3&!L{35&Q)CfFn6F8 z!a}$ZMiLOTXoOjvnzcJqd6CdzcXp(xJg)W6w*R8o#@i!ONuWU}jX|Nc;w4H$k^SC6fJ#I{K*j!HoiXI@>M_#=(KOUGt ze8_%K>aItc=POp^E{p%294sk9=q*Xz7J|~HIj&{hC8>lYU4-#qe)Lc&i$!``^Xq5k zAJ6mvf@&7R#Sh8=xP3lxlVV2UDMf<(%rq=Ghgdt8=6t^c(2=xQ`6%}6FBu=vX}jj1 zON|gq?ojAy+mZ-xQ`6;jL_*oPY*#350owG9pMrL^OLUp#TSPDghL(c6G9fTOf$F+z zgep>hkBSr`!x5>M#D53f5lA0?gyAxDnbO%5Sz0NO3+uE_0JoEL9=qI1W;x!qsv{ku zDZse<5~V6`0L8g?^V=nE9EFrYFQYvW;`>AVH>FOjLC34M^2dh06W+4B)`#1%Nmh8*p&_P#@l#3kR|+~23x=g#&s0uh$)u<^YQE~wR7q)D>wVPp5J9q->yM9X_Y3XJ{7pj zOMrmyyE5`JaY9_prbYxqB2#N9@IzkKxcdBU%w;~2l2n%E=MjbLvNosWgdUOxnl+l} z+~NO~txib6NS6#WuLbhPg$WZ3UwteCL1pU9j65`zQTgLL`g8)QPG;#_?@L5@Diio6 zwoS%yV9Ni~pNx}Egjn&J4$fqO#J!kA!Vdwrc<`JPeWe(wL~;@yN858D0Y+3(y6V`u%wW-gpCG^Y{gw(_+WoJkz&M;p;kV(BlzV+3ekV* zi~lc>Z>@%M5{9fWTgF8K7Dl6vEz-txB)nvNuf`3tFN&ofTF$xoG8+>rAwsw*e+h=k zhZ)+r$NZanzL;9jmHmIZh|(af9S*JUxt^!W&`%skmnX(sUUmm6`jMMm6VuZU6OZkV zqQEr<#=gnh%Fr>{%pdlLWw8K{A7Rw#1k#!vIGKe^Cw7PK#(LfXNyKCA?H zYMt6OO*HT!%4DPG2+%qZ^m^&;jN3`c@Cgb9H3l=Znj@a@12dIZ*=jM2n54I@1O(V} zwKBnw&@_r%x&j?IP|j>1rV|UqZk>OG#q+~b_G@Fpoc3(c8>A$lNY2VF)Kqllo~w>4 z(2uu(_RoO}2rN8A_~XFV$Msnbb!zpa;P#Lt%0CEiw++Nz>4m4?2SL+Sj=hbJ+`A!( zSVF%4?#E+*%($*gXs7ZDT}ZGjx^kjSaRuB}e0E{nPXHLFV>a*;OP@XBXZOF<-Ol^> zGYI@kyTSze7kssWMI_ca;CE8t!E+YKM#AnRAVN9ccBc}qpO;~tZ~YO(dmp~L@&fW!scz99DG}sGSe?n@+>yY z!DYi3oYTq_=Z35rexcw{ley_jU<&Ty$S2xgUa|9tw9V9#<|1rAZDJT) zgC4W#L%M}9gDrP^<4=vz|4w{CH&7U57gUU;Avj^S6(kb}FcSt`KH!sc<5RS$cb-Qd zd}o?SfTt>M2OI0WFwE?jWjMQhKq$* z03lcy{K1wOXo6B~ONQ7CuIp@Vwjg(!et{7~7Hs{Tsa#6C8hXK!vVxTb69(Jt1P;8k z4JQ;2CXF{4VP=1)Y-VbEtcf9}Q?i8)*a35_2wk|g`-!L(z^1sz^1=yt#kO}^q#a2G zvHCoHfQy`=y!5(I)S8bc2)Y-QXA_=X7%xQlG;5dpwIC+xY`_0=Jr!Jmp+%A&7zrd= z5RTUnVWtjt?)xS{0c5qULEQmH@!FZV9$ATfvHzrc`#hqIY-XX|twLw(NxQ=MI+hGU zn$w0w7kxX@Lv+x2SBlIJs<|dNHH>~}u_W6BQj&b0M+r$ifAV%{2Z!>C9@2CMvNbn% zeNGbiHwnv{%be&dg%y#{uWO|eqnP0EeFri9Ic=OKvj;5 zYa)n~jDiY_G(=?Sf_Ibl<^x>m$io@^j|_ruY$wVQ31Z0iQe&4vh6(y;GnHa;tnpth z05LPnM*g-cX(&I?{N4O@5Xh+7;tM-td=F_6VT{G^^c^q_)Tnp?sx9QA=7 zD3qa~`Z~X&zJw(o7!a;t5ZqKJ)*wc<`E21%$|#l?Z1D zOY=PuCO=4xy$Ol)l@~DunMv&PYAgk4;HSoTwpq)Kr7*=oFlTZg@Ic$xh7 z>UTg8uQ<8%XVJhg22h4PoAUf#T`qC!KdA`}L;YKgK8bevHrqHNguad9D%mCsSKlJp zbH!@X{L*XNiBJUnN_@G~rBtwZ(VZ5GX`E_hb#YKeL$^@J#VfOCR>T@}zWMwBDnWDT z-RFMx<9}r_Df6X3)~`t~`;iR>#wy?22O385zx(7-=&l|frcb;po{dk1Pf2wa1{ZOLp+r{#PY#d%roqgyA zt{i%!f8%);V-*iUC!6YrU_GPYE8B@y%&~#TURC}sDQVg0zrBHQHip<7oYznE&W8C) z|336{F)*sTBVt*bWPm`HJNqIjoCuYr=`|A2EX|;goXa-A{{J!KuXOUrXJtKO@x~ z1s{d>shg1mPq}BGkj_5P&pUUI!5Ew)IF#oRhUoWox#*~52@m8K(t!CbwUxGc=ERiW z(lM>Cs5_26nM;QwLDNetqZwct508fy4qsF%!w)EjfX z%Nfu_z7HnRQ-zW!&bZTl^hCGXL`W>YB3{~HeeJB(7=;#WZ#jx&4uDY zPXMMWg}r8v&eAl=0YU>!J|wHI(eC$3ZM(N!xF9h?QRn|^@5=w7Y`?#msKJwFsFWf` zl7un|jb*Blv>@EX*jkK2WZ%Xz^{7E8vW&e)Nw>A^OH3t^u{<&MEwW@A8B6x>M{ShS& zTIKV3z{3vkrfh2mur%Y$R^xhoQ(IOqb6t^I~au@s1$CP8rh6^nM-~iZCwclytCvV+i(bL)^1PA=p23g9M5$$DsJ+Wiv_w+ zKx)xDC~z~IjV=*c9JzWHxRs0`n7MW&Ez#yY-!8w1+UB9H2dka}G8^(J@Hv|+PD#=9 za_!QwI`&D-;g5SF`?v<2Wb6){ZP_y3yHSm7Xk8jM?QRi#H zMV0wTQhCs~3#IfoDGR9crw%a4Qw`0eZ>l;PE!~sJDx2>JZBqu zLdKoK$u~Vol)>q3>3p)&@m_~b>ggYz^2_1AI&8!YW%ahm)vv`mBMYiE476G*NU&xj zXZ8f{9S=JXw}YtuEa z)yIwtq=bB{y1uh5=#b8{xT}Yc#2ETM_?D=;SEM@hxeOO5dt3$BptoY5Aj5nCJojd)pG85vQzh*pHfRNhij=& zYJ(CwBvVfc+RQ6d=JSk9N6d^Kt}c+iE)w|_^(KM00K^)=23jx7_}|X~O*Q?c=9GPF zQn(t3v!&~`3;6u!DK=#)GRxH$tMs5#`L<@H8|Fy=vo6bSZ?3(N*?hM4F-t1L^h-aY zLjLsk`{ylxzp3(Il8g-73@0(`1wR;T+j^3|yLVH%;i2;K<&ob558B+CcZej}j%CJ3>9info!{l}uCup0U7Hs*7ckY!n{~$) z+BQ>&6r^2JG)C~!j8cCyNYy%oL2fm&i+d`=ckMz@Dz!G1hS1u=jW)ob-=ot7`9qH1 zvyQIYErUZ~b{;;z_ht^Z+NQ`d)vvO0;jL$5sjpwZleB`u%=A)ap}+m&+m$NYl(!QF zG?m+owwwg|fqi)ja(4)+aLhhr#QM!}Lq*QF?RQP@F?je;W4hrC;|4 zw7%P)OT9U`?3pnT}-(aDzMdG`B_jEmN)C_ zz$DXL?4r`t6{ucY_*^-D;d_g~+)CKST;NvE&&=U%%`Kvk(x6&|TexOH4@wam9!y)& zs*Vu-erCIs=L&Ofk@Vr6`w>$D`$Tq4p)o60tJ+nhIMofwT_k;MUer0$&f9qANB2;n zA~lS+2ZysNf6Wq+GlGgkXvIoLOkZ_lN-mK7ui-C}q8S^!sIkW1H?`p6z2ZVIzt4q0 zZsXe@MIU8;Hh`RHwDQKTs!9^CnhMUU10LMIiv$(ZXt|{?=EsMIZhZ{|GC??Q&2;SIfOqqVY4&;RA!Lh&`!hJE$t0!F`3k>>pch15 zcX@e_)n!N^uvLp=AQP4>_Pv#Z+{>4@kfdEDm&v-m-)}+cQrP4?=vt^y$0J4*juV_< z3b!AD+|7xUR1+55o5yHXuIkBqF)SbfP6@bc*i>xXhP$Y3Vms zsWiwUdARdu6qC}Cbq;d>PW!o>wKh>6%^)dq1hS9x>A!~DU(jY&C$@W^G#~kd6FxJ(C9L0&8ny@(*Z-ecY~5}Np=@JE{OS&eJ9(g7ve9e@M8__ z%~e78RnT)P)8H~MV&X20vbo=DzJmm7VPr}pb6B9RMGTr>qLs`RaEY+7GcTCt8lmdF zz=Ic=8|oHAA|Br5uGXVS4TSy3*&}k~d+=enwwfb&t&``;&WB3fDzUm@|Z8J3;=Gcg5pPuZ;c7 z+(?WD9+Y5fY2UU!-+N&|kiIl!yvr%012&U)wvu=EWJ=6TGb=jxXOFvF22+VoKW-`q z&6m)AuGMw5$pg<8F7YAzlZ_MM<@3b-c>9fIN2$9(%vG1n5M?6=U@pN4%XTT-uXvc& zl#f~*Qo5RiT(;ga)v60w*sv|!V%yTMcHh@Z=1t%;Narx1 zlE~wmD%o*JUejX8_2gtPM|HF^B!_1XdUUN13y_=nP?D50{oy{&Wrn!NhP3`yunIl5YFZXcD60+cj z+SM`>IR@^)Rza&K94EK9;*(u$E?gB#>&_`61Yv$wG73z}jaXIZs-HGdQzkV7S8k5T zN>7-U%L<~KO-?+bUwj1@YgK2HPd4MJbv*v^xD6NM`>>B8vB&wZeX$-1Tz^fQnWG!O zoVX_JYe(*z$g>*e;XZj-Jk<%^VxTRr4=sk%OhlLXEOi12uGA<+&U}Nf%HV9K-O|@; zi*PT5!ofT|mA+;9q2EC#Pw6g=$+@KAhCi5Ut_K#1q^NA*HM$R2z{+l8oWI!d8K4lz z@|`8VN@W%Cxx^>tFqiB=a0ByQW>qE>ZSqQnP2H6`2uO$SdAdr9%s;=Qb&LB_0k z$?K&$t;dHvGtVNq1<)m)vmsU*V)D`MNalySxZw`G6gG)MR;JU?p2ppFu@Jh1_#e8F&;rPTP9iDI6ZxlN_XS z9+6&#@sI_^oWf`%<>aI=%1B4q+VwgTS@V++uNb zh2-?^Eh5>lW;pF(!(Y*hxxZO2g4SIaA9G#d(m)v9dz60#8=z|)3!Fs0aLWA&4{TRz z+T+rqvJHWBMX4PG9qY9-H>&Dk9}l9M%YSxtf%fy2af`v^Gw#M<8s27Pd66}oLUeb0xe2MuVa3${^0Z^F1S_#Bch27u(${ZA8{T*e zX5eF+_J)=L4@b6JQBMalW{?rJ%u#{!YBmKnLK!!JuSQ5P{F8VpVE{^qg{deJ&YO*UG zo71Ku6+U0m<8!ghG9wVI=Dl`$T2kTV3q>#@*UR`7?%&f}WVilsYqR zuz4Un*k{|I$5kAtI7LqN2mfecbjNF;wi|c5MUx1SoM%_X*FUodS=^{B{efad*QNan zPqiU+O{|!j4JUs35K!EP8`1o2H=}i>3fa$OUd$J7J`HHYF)5{FU;uq+jOWKQfed}5 z-e+dND4h1;Ryu4cf?3pj6#LTvxgxbGz?^9AUNtb~TaC1;WoGXGk@@y9Bb7RgWN{HzkXDGq zT?r(z%zTlzt7Rk8jf zwI(wcka!^#4O~-Kr=x6F2D~nbl`s7x@~O)^uX3n8r|#}=n&ew$uEauhNaW1$`VAUz*cSLnSM-n>KyRN zj)CEbbJgyoUD+L`JULJ3woPpm$U+TUsZQz-TlVX;RMC8SrQw3q-M|jqC>0@T`!GXvH zxp!tB0o>ekYtF?JF+2Bu20_J#x{o}vEyACkENjFP^vdbT_kr{d z-K8^EYi_D*Ll!5om8VGkvh2lz;m>uZDM#{VI}fuD19@o-&X;+9BUZ4lMDLB0ZJP4C z8s+XzF;`JQ@AC6~D|>op_q%;s=ciaJ#8tU%T)cvyHt?gy z5|j%E`FP;*1=cp&d1pCcbsguVph6XOG{2+*!1r=H9JP6Pr5U5;T$nc{aft*a^at5#EOGh%S1Z6b8W%nU>*s9@GI`~AO$n} z^xnrlu3R-c1C9vPHKCumw33@--6a&DOKwCjuSrLGSyfpFt1sUq-!Es*9}5?GJxw}(G7JM>hK-4E1mS?9j~{U5kPW#D9j9lgHe>q z@D<1;gr;z*vm(8mmvRJ`+nGIfxs?Rf-$2KHk~meQaFHV1EU>b?NW+sn!M~j1;xO^N(q`RM-gg0V+S$WxJngpW~^#)QDIURd1!{f`C zAJ6vs_FrjA38uAcRo|vBjfhU&-iOQtzGR}hTWhMA09kmmMd!PxgXZ_KJufdvAIoEC z<2ce=r`eCQ!Pd6b6;H0L(N%}59zun4Yke_>B+ozV)4o*hWBRq)_U0S(h64i;J>8wY zDe8_wo|F4c04w9NR84$huDX-fs9&#tlb!c$P3gAP zWipZC&O1V1a$2!SUE_7z4WLL*51a@76$L&VdlVR`!91*V<}ca*{v`>lr?JHl5B}Z1 zzv4#y1~|$N+=a0J8chf!*dh>bIdiSL|8M*U6l(0lBLm6*8jTijHU+UkO}$X)pN0G- z8C>gwTt1f83b@jLefif^e`)oXt^RVWUtsk=fvZKQ3MgD$Tdj16r;UCA*Dv7u1zf*? k>wf~ceu35h4p{v>P_j>?KgBvSgbV!WXz3Dj&RF03KmQ`vN&o-= diff --git a/src/sentry-api/assets/sentry-glyph-light-400x367.png b/src/sentry-api/assets/sentry-glyph-light-400x367.png new file mode 100644 index 0000000000000000000000000000000000000000..b18c2e69dbc8d099bb55d41504bf43d6eac08ef3 GIT binary patch literal 15402 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 literal 0 HcmV?d00001 diff --git a/src/sentry-api/endpoints/post.js b/src/sentry-api/endpoints/post.js index 39ef142..69d6411 100644 --- a/src/sentry-api/endpoints/post.js +++ b/src/sentry-api/endpoints/post.js @@ -14,8 +14,9 @@ module.exports = async (req, res, client) => { const event = req.body; const embed = new Discord.EmbedBuilder() - .setThumbnail("attachment://sentry-glyph-light-1000x917.png") - .setFooter({ text: event.project_name }) + .setAuthor({ name: event.project_name, iconURL: "attachment://sentry-glyph-light-400x367.png", url: parser.getProjectLink(event) }) + + const logo = new Discord.AttachmentBuilder("src/sentry-api/assets/sentry-glyph-light-400x367.png", { name: "sentry-glyph-light-400x367.png" }); const projectName = parser.getProject(event); const eventTitle = parser.getTitle(event); @@ -29,9 +30,7 @@ module.exports = async (req, res, client) => { const link = parser.getLink(event); - if(link.startsWith("https://") || link.startsWith("http://")) { - embed.setURL(parser.getLink(event)); - } + if(link.startsWith("https://") || link.startsWith("http://")) embed.setURL(parser.getLink(event)); embed.setTimestamp(parser.getTime(event)); embed.setColor(getColor(parser.getLevel(event))); @@ -59,7 +58,7 @@ module.exports = async (req, res, client) => { if(location?.length > 0) { fields.push({ name: "Stack", - value: `\`\`\`${cap(location.join("\n"), 1000)}\n\`\`\``, + value: `\`\`\`${cap(location.join("\n"), 1000)}\n\`\`\`` }); } @@ -68,10 +67,8 @@ module.exports = async (req, res, client) => { if(user?.username) { fields.push({ name: "User", - value: cap( - `${user.username} ${user.id ? `(${user.id})` : ""}`, - 1024 - ), + value: cap(`${user.username} ${user.id ? `(${user.id})` : ""}`, 1024), + inline: true }); } @@ -80,10 +77,8 @@ module.exports = async (req, res, client) => { if(Object.keys(tags).length > 0) { fields.push({ name: "Tags", - value: cap( - tags.map(([key, value]) => `**${key}**: ${value}`).join("\n"), - 1024 - ), + value: cap(tags.map(([key, value]) => `**${key}**: ${value}`).join("\n"), 1024), + inline: true }); } @@ -93,6 +88,7 @@ module.exports = async (req, res, client) => { fields.push({ name: "Extras", value: cap(extras.join("\n"), 1024), + inline: true }); } @@ -102,6 +98,7 @@ module.exports = async (req, res, client) => { fields.push({ name: "Contexts", value: cap(contexts.join("\n"), 1024), + inline: true }); } @@ -111,6 +108,7 @@ module.exports = async (req, res, client) => { fields.push({ name: "Release", value: cap(release, 1024), + inline: true }); } @@ -139,9 +137,7 @@ module.exports = async (req, res, client) => { const channel = client.channels.cache.get(data.channel); - const image = new Discord.AttachmentBuilder("src/sentry-api/assets/sentry-glyph-light-1000x917.png") - - channel.send({ embeds: [embed], components: [actions], files: [image] }); + channel.send({ embeds: [embed], components: [actions], files: [logo] }); res.status(200).json({ "message": "The event has been received.", "code": "EVENT_RECEIVED" }); } diff --git a/src/util/sentry/parser.js b/src/util/sentry/parser.js index beafe90..35a2f18 100644 --- a/src/util/sentry/parser.js +++ b/src/util/sentry/parser.js @@ -1,21 +1,5 @@ // https://github.com/IanMitchell/sentrydiscord.dev/blob/867b889e15c6b101d619610d07b4663c6a73fe6a/lib/message.ts -module.exports.getEvent = function (issue) { - return issue?.event ?? issue?.data?.issue ?? issue; -} - -module.exports.getProject = function (issue) { - return issue?.project?.project_name ?? this.getEvent(issue)?.project?.name; -} - -module.exports.getPlatform = function (issue) { - return this.getEvent(issue)?.platform; -} - -module.exports.getLanguage = function (issue) { - return this.getEvent(issue)?.location?.split(".")?.slice(-1)?.[0] || ""; -} - module.exports.getContexts = function (issue) { const contexts = this.getEvent(issue)?.contexts ?? {}; @@ -26,6 +10,40 @@ module.exports.getContexts = function (issue) { return values ?? []; } +module.exports.getErrorCodeSnippet = function (issue) { + const stacktrace = this.getStacktrace(issue); + const location = stacktrace?.frames?.reverse()?.[0]; + + if(!location) return this.getEvent(issue)?.culprit ?? null; + + return ` ${location.pre_context?.join("\n ") ?? ""}\n>${ + location.context_line + }\n${location.post_context?.join("\n") ?? ""}`; +} + +module.exports.getErrorLocation = function (issue, maxLines = Infinity) { + const stacktrace = this.getStacktrace(issue); + const locations = stacktrace?.frames; + + let files = locations?.map( + (location) => + `${location?.filename}, ${location?.lineno ?? "?"}:${ + location?.colno ?? "?" + }` + ); + + if(maxLines < Infinity && files?.length > maxLines) { + files = files.slice(0, maxLines); + files.push("..."); + } + + return files; +} + +module.exports.getEvent = function (issue) { + return issue?.event ?? issue?.data?.issue ?? issue; +} + module.exports.getExtras = function (issue) { const extras = this.getEvent(issue)?.extra ?? {}; @@ -36,47 +54,47 @@ module.exports.getExtras = function (issue) { return values ?? []; } -module.exports.getLink = function (issue) { - return issue?.url ?? "https://sentry.io"; +module.exports.getFileLocation = function (issue) { + return this.getEvent(issue)?.location; } -module.exports.getTags = function (issue) { - return this.getEvent(issue)?.tags ?? []; +module.exports.getLanguage = function (issue) { + return this.getEvent(issue)?.location?.split(".")?.slice(-1)?.[0] || ""; } module.exports.getLevel = function (issue) { return this.getEvent(issue)?.level; } -module.exports.getType = function (issue) { - return this.getEvent(issue)?.type; +module.exports.getLink = function (issue) { + return issue?.url ?? "https://sentry.io"; } -module.exports.getTitle = function (issue) { - return this.getEvent(issue)?.title ?? "Sentry Event"; +module.exports.getMessage = function (issue) { + return issue?.message; } -module.exports.getTime = function (issue) { - const event = this.getEvent(issue); - - if(event?.timestamp) return new Date(event?.timestamp * 1000); - if(event?.lastSeen != null) return new Date(event?.lastSeen); +module.exports.getOrganisation = function (url) { + const regex = /https:\/\/([\w-]+)\.sentry\.io/; + const match = url.match(regex); - if(event?.firstSeen != null) return new Date(event?.firstSeen); + return match[1] ?? null; +} - return new Date(); +module.exports.getPlatform = function (issue) { + return this.getEvent(issue)?.platform; } -module.exports.getRelease = function (issue) { - return this.getEvent(issue)?.release; +module.exports.getProject = function (issue) { + return issue?.project?.project_name ?? this.getEvent(issue)?.project?.name; } -module.exports.getUser = function (issue) { - return this.getEvent(issue)?.user; +module.exports.getProjectLink = function (issue) { + return `https://${this.getOrganisation(this.getLink(issue))}.sentry.io/projects/${issue.project_slug}`; } -module.exports.getFileLocation = function (issue) { - return this.getEvent(issue)?.location; +module.exports.getRelease = function (issue) { + return this.getEvent(issue)?.release; } module.exports.getStacktrace = function (issue) { @@ -86,39 +104,29 @@ module.exports.getStacktrace = function (issue) { ); } -module.exports.getErrorLocation = function (issue, maxLines = Infinity) { - const stacktrace = this.getStacktrace(issue); - const locations = stacktrace?.frames; +module.exports.getTags = function (issue) { + return this.getEvent(issue)?.tags ?? []; +} - let files = locations?.map( - (location) => - `${location?.filename}, ${location?.lineno ?? "?"}:${ - location?.colno ?? "?" - }` - ); +module.exports.getTime = function (issue) { + const event = this.getEvent(issue); - if(maxLines < Infinity && files?.length > maxLines) { - files = files.slice(0, maxLines); - files.push("..."); - } + if(event?.timestamp) return new Date(event?.timestamp * 1000); + if(event?.lastSeen != null) return new Date(event?.lastSeen); - return files; -} + if(event?.firstSeen != null) return new Date(event?.firstSeen); -module.exports.getErrorCodeSnippet = function (issue) { - const stacktrace = this.getStacktrace(issue); - const location = stacktrace?.frames?.reverse()?.[0]; + return new Date(); +} - if (!location) { - const event = this.getEvent(issue); - return event?.culprit ?? null; - } +module.exports.getTitle = function (issue) { + return this.getEvent(issue)?.title ?? "Sentry Event"; +} - return ` ${location.pre_context?.join("\n ") ?? ""}\n>${ - location.context_line - }\n${location.post_context?.join("\n") ?? ""}`; +module.exports.getType = function (issue) { + return this.getEvent(issue)?.type; } -module.exports.getMessage = function (issue) { - return issue?.message; +module.exports.getUser = function (issue) { + return this.getEvent(issue)?.user; }