From dab9c22a0a6210da899ea6a1e377179f03d7a0de Mon Sep 17 00:00:00 2001 From: ren Date: Tue, 19 Nov 2024 18:18:08 +0200 Subject: [PATCH] Big update in a while. It is very functional --- .gitignore | 8 -- client/index.html | 25 ++-- client/velendeulogo.png | Bin 27837 -> 0 bytes fetchTltData.js | 0 main.js | 311 +++++++++++++++++++++++++++------------- package-lock.json | 46 +++--- rollback | 285 ------------------------------------ tltmapout.txt | 8 -- 8 files changed, 246 insertions(+), 437 deletions(-) delete mode 100644 .gitignore delete mode 100644 client/velendeulogo.png delete mode 100644 fetchTltData.js delete mode 100644 rollback delete mode 100644 tltmapout.txt diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 37e8c77..0000000 --- a/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Dependency directories -node_modules/ - -# Optional npm cache directory -.npm - -# dotenv environment variables file -.env \ No newline at end of file diff --git a/client/index.html b/client/index.html index a1181c6..9ce2bd6 100644 --- a/client/index.html +++ b/client/index.html @@ -16,13 +16,15 @@ - velendeulogojpg + velendeulogojpg

TLT Location Finder

+

Type: UNFETCHED

@@ -45,16 +47,12 @@ var socket = io();// // Stuff for the map - //map = new OpenLayers.Map("demoMap");//.setView([59.4370, 24.7536], 12); - //map.addLayer(new OpenLayers.Layer.OSM()); - //map.zoomToMaxExtent(); - map = new OpenLayers.Map("demoMap"); - var mapnik = new OpenLayers.Layer.OSM(); + var mapnik = new OpenLayers.Layer.OSM(); var fromProjection = new OpenLayers.Projection("EPSG:4326"); // Transform from WGS 1984 - var toProjection = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection - var position = new OpenLayers.LonLat(24.7536, 59.4370).transform( fromProjection, toProjection); - var zoom = 12; + var toProjection = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection + var position = new OpenLayers.LonLat(24.7536, 59.4370).transform(fromProjection, toProjection); + var zoom = 12; map.addLayer(mapnik); map.setCenter(position, zoom); @@ -65,6 +63,13 @@ var tak = document.getElementById('bus-id').value.trim(); socket.emit('takSearch', tak); }); + /*document.getElementById('elektrolino').addEventListener('click', function () { + socket.emit('elektrolino'); + }); + document.getElementById('pesa').addEventListener('press', function () { + socket.emit('pesa'); + });*/ + oldMarker = "1"; socket.on('takResults', (typeR, lineR, latR, longR, takR, latlongR, vehicleTypeR) => { console.log("Datafetch success"); @@ -98,4 +103,4 @@ - \ No newline at end of file + diff --git a/client/velendeulogo.png b/client/velendeulogo.png deleted file mode 100644 index b4a75d9881abf710bf8a55c9113cae97ae9f0df4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27837 zcmcG$cUV)|_BVc%5mZz}R8*RUfQS@9ddWBzOb}2opi+V&qEezDAT7ZW#R?igKmKqvu{oOeg>-0R%?z4yMq=ly;En1?(*=j^@q+G~B*XO%N| zk6W6pUA=8J1VL+2M-N#;kO&@vmcLjj3jXEpi*+;L&#Eg&Py0ZS_y*yB%Nl#|JP6tj zp$;85dHvaVPf&D<@7WQUR#dWVt*DYr-qBM7>o! ziXsa^>kdlde?^jc&65_W4jXI7r-QE*B~k~+x{4-(x>Cq%q0p}@k8W$-(B8I46v6BRWP=4^hl( z^=yTgLB}#$rw@iI1%YRQXfmkcw<#?_k+?ss�uvq&Peqlp!z7Osd*)43|Or!IRu~ zqO3>Q%XMlfiq#F#tsYc(ta>ZHr|qOKWEwp&u!12X4!N(P+xvPMGyl zc-}XL46(ISxj;BXjT~m0Yg;?sUmASh!jM-oEW&=SXhpROJm3aG_!f;jdrx@>TmlL?DJr`A?VwC2Qyc(-jrWuaB7n-#jW;PtMp z=G=PP3B&ZwnQ-Ysuuw4{fnp42h*p!}Mv`n*s$-(#Kcp9!R*?lHJTEUQr8|0XI)O%Q z6AG|zJw7|4Y%r=+S9$13is4Jl8Ew9<+bJ5uF2lMdfror1I%T20M zQ3j-F!{>|S_>4?CP^EQhlS+*U$|-lA7c?)SuLeP%*W)#ZoOm^krRKSMD%DSN*$g#Q zQx)0hMbw^_ce8{b8g;&+?<)k&?BY42%ehgdh2L#hJ5|RXjt#uH!}9?47cvytpl!Tj7|KcJyl$J~+PZZ`^kq1E!Syf$esl zKO1ygu@ZN84=OF{q=aHXjl~>L+e;-FR3 zIHg7a3?gI|GVTw@*|{|=bJ9pmbVqAw^agxLgvR0#j4yG451&ab;Z==H zD5j7ZRhosGjzu-7#mCPk4=_|yW2`R_2m2N2+&0*Cev=eM5eiN3k5G7%)05m@P`alh zVX&Rpn%kwVILVzgF=f-qr7(6@0_8Nv;Jg8{f(tt0hdqe(-g%>a@&;JMFbGHA?KbyZyn!E8PhTvJ*Yq|8$USGQ%YdhK~Vh;p7R60=15=s z{+b1ZYvD}IW=5M^gpN3M63OJlq(KVNfxQEmYv^rotx86wIm~;Cb{JsR?hA`j_>kdK z1Hh_CmS{s2M4NI4=bewx2c81cmh2P?64h;!D%*xGk9W{A#)n~PvQn#opA!9u#=yEI zl7d)kZ<0kJ=a3EfD{+MrT?Ga;YMDfBbZuSe;HlrZv+*u37_s@*2+k6WSO_GFBd=!x z1o+iwC34Hx!VqzA8whQY)rYtbHLFjCVeMk}B>Dm53F&hXN<3@DeYaA$s8LO?V)Ya2 z3(WfEK;~U_`!I~y1y8-PSpuqDz!DJx0W*$$bJO*&6i0isw>i0rJNLRm31*fSn+`;>!`u-e1=0K^rC^Xu= zSYJ~3Xb(7%n*gqzMHP(jg+kg`a^ICnw{&TjY1DAg>l~|NS5omebuV*UeC*Om3$uh& z2Z2EP3^0Xb8VoU1L#cn8P9{-L(V!$H1-o-4HT9;hA6M;xQ#(v9Ve>Wefj`8VRz|L! zC<~G@Wv~G>52vosch1|wmF+bVeOqw4sLaOAs zezo^zw815d4>#gflY`o2Q&UR$2Z;{J=V=c$%BqD|WwE9=c}r`KbayG|o+2S3S`LwU z@P&jDaAR~liujorJRprZ*8@-cXPX^m;^`uk&=O; z>EiJEoIxE-xqz&Q1veZ_23Qx0QRH0=1B?6k5bcT2zM|ttWz_Dkqzc+va4Bs2h3=~1 zEy3j&>w+#!Z3v=e1*-s7fU;MIDKI-Ztay6T^TFJdlor?%-cU(~eP?As&IC(_pmFcUyw0+rQxn^#gzv6*>nRWWiJ+L{cTlf-+MmJ1!QY8UU6bdo=HQ#1T>&86j;YHlX=_52uL@=^rgU<8rQ2Z%Xv;&k3(16)lxS~*tHd`RL#v*? zZllf%qfZYcNaAPjXH1H+C1Qx5=^S2=*OuT-5EQ-ve=K#RClBa#9ua^?l@IvNTfAk< zm^yK17f6zfqAR|r(x^dZYV9p}YQ_AxLa+`5=`gCB1A0x2$f)Vtie?&ko4q_+-S01) zV6-K^j5?XP|e5%NT68CS>t<0BHXx4or?KEzaRO&Shy&mR zhdj!IMp6;Qx+>MtjWXJmxY6!PT+LO6-uX#OqNPzy2uht>KO&3@GKp*#3s3NLYjbkz z0yp0JLWU{s>@94v&njwa^(}g?kKJfWO4N6Em<6j>+(z(DN!hb{b5y=_ofxeybYoB& z*_=CT5X-g?bl_%QncRbz6%bJB)LwAb_D5j~8D7jDqpYL3X=vuR54aS74JQCLjBLQa zY;Z)hR4!7P07gRB9_Hp;Zpcz#mZinWw)KRC>|+#Niv|u*97boWwI-}QR&1Ku>C+>Oz@bV~ z_y_eJ{%XBRJ1(WB?5XNC7DqCac}kn{Jqjl$Qcg-BhNhWG{zbryzZ|cO%+X)UN{m$s za3{LhtK{_z0N1+CXwwd7GYtxFGh$N&n5K9vZ0C6W$Lg;n@v@J#S)G8st7Q&0e-H+U z#YkzqiO))El8d_>-VtCMh$t+4l5m5Km62867x&2rG8G20hL$xO06rrO}X_;YXZ@B7}tk=GAM)Nj+<*FvJuN5 zvrlqJ+ws#tGo5JDr-LcBjc0;s&R^);-ww19%8Yt-_ALL6fjte_AOTCqzGfaX->OW|evAC&re zSmu&rp7o+HW$r)rm!0O=%&`=}yHLK2(j?(N$5a_+#6j@NwIa8-`YK!VO>VMff*n

&Fk?p?N+_TF76m1t-{sgI$IFDuw)Q{cGX{Hn}vfo87o|N zQy5)zX25^4eZLK>+8>Xp^`Pn%0efAAWau@@np3i@Q^8$Ck5$t3g&-WK$S8Wp<0b;) zni>7lZ8#DW(pv+bRR)lE)Mt%xJL+`4fTh=v1LCyO0j}qIBz`0!6E%tQc2IRyLWR+@ zr-X}B9}jQw&ZaL?f2?}Sypqho&osy-*w?6`8or5QW7#qQ-+l;ja2*Iq=tfIxlj!Kr zgaKKhpJlG3-d_A_U;)ErNk~CQ9pX4(ya8(zB^na@) z-wnfj_!pdloa4L*~F;Orldadj%RO(`xmM0a}xGVy$&UT4^M z{G$9LfUd`@23QEAZY;G5=yr=Lqo~1TU;u!UH-_kPLG1QPLM5*K`k%@*(C?hJ{T|wi z*>b{5KDCnSJGNDUo})9XG_G8LK7)cKuAsuObO4io*=EBr_0|mB#bQ8T6x!?}T6n?}&cei#80#h(jfjHPYwGdO!+r<&OY7BL7^JW3@GRqKkPOexG!XBumqHbHN!Cb^j+U?&%U zV)>{SO|w5y*`K%g?6cet0gZl;n@R4&D_In(G6EGtDix4P>cL9}Ao5*V4gC?$PB>?8 zTIk|K3{f#Cj|r5+YH`<=vzgk}p+flk2eSZ9H?nODzQ?Y>1~cJzW(e@BGQNROP2OSj zjh)jufgoLzR_5TY*S>>==KAG(q^iVyaFKS>u4mZ6Ke!$`cjW1aFtm&2e8kln&$@JJ zSWG`ulrHKgY!5wvzF?i3EnvkW=e2}p2>J6~y|+OYhPVrZ`8n0p0!2Wqe5!G`270EL zoEUIE`BL`NQDM!Z*f6~j_$R=%AM0vB0~&bgy1t@sVd!07$IuHdV*^py_EYV* z+TM(S)QFgGV{LL05c9&3Zr`dQ?8ydLrrihhlC9BA`sie+JsZr71A*9PRGGGoB zqT6}4HBsO~%*Uz?tvuBh^BbHh$#f8`8;ftzi363aJHx$i8Et%0)SiiAYp}2P0y)_e zz;eA3@8fulFd?^?zNeU%>Dv42YAPPk0rQc~c=HHx>aM5uTwh;e{s@uBI@xlI>IGg} z3o@>6%|?aTeKtau4Xi?O)eyWV5#aKWv23GUu;+79z71*4L1id1%7OhPk7cOY7Y${r zucGeLpNN>S&k*KMXHxSQCurMwPrz z3&Z~x%hG|qxixP2#Q4hsx!Y{}?LUR}N^;woTiE#oOiPk#dMD-_kn-Vn-nyns{vK5I z8VyB*MdwE=sfaKv4D8=+9iz?X7X~vF>y{NAtedVLz&Q=7AkKWi9Iv4P zm7v&8?<+T4kZB4>3(VtACdi}l2xZ>`6F)*p(PNFWM}h$(o^ zK7H>ntOf%R1UB<~+?K+ZzuLhYdx-%%k_gA9RdJ@D0dlsAG4$T6fCKLLosrAquKfe> zv#bB~nli6s-6TBULL4JvjXnb`JEq5Is~*77DLOSv7tl%VW1L<<(|B+Hdb}oS;C~bO zjY;OUZZ=|lHlfLF1^&=NES~q&+H-h2v&IU{~%Z37V>Xn=Y0X??3pEW zaNONGV2RLCt#2Xqw>e>5MUGK}xTx_s6<5Ct?M6nB{_B+Ux-}=vl!ppX23Lj@%6N?^ zK;rinGFaTi;H9}t?Q~%X&4^w|aPFZ_DBwrZV~z0U#XobWIytISQ%E&=-fTiKv6wiP zfl@DC+zU90W`K+?&yrFONM_BbSxoP||Bv{t%scYb<QxqR^Q|V^8Hq2!LqrodA&7NeyvFsUWcDUK$Ba#E zJ%ggBtjF`6cJZDB3u%Sxu)JiJP&;-oG*3P90$MNhUe~+tYT(9om z3+}4?2v=<(2@s;sbtWDF1}lqof93kN!5EA`Obz7Ile7WJb@tt_&eNp>fFHAHCuCzb zZ#yQu=$~VMC9aq`rr6T$V9j?y;fF}ttdg^A)n$F`{YpIfpsu-kZ6T*QB^&HmiBn5cT85o^ZMgu1l9{a&X~R{NT5t7e~2j>+w|| zzb6L53p>EjtM&C&fIVo4p*)mt4F&+MrYO@;xLKi)yBhc@x$2%ay%$Db{!iPzbZC14 zPh=D~FTpV~=IL_|3myPc^n;mNJj)W#uJ3ig$ZI!2-X!#cpBdO{>WQq3`FZM|^xjE<(41WwJkB;l(0se8lxcnFA}d^=NghzdV(#N*tD-i~|%%#0v;e_N!geurvR?OBF@qi0v) zD-a++CNUW1if^Q^?i@P@%;W zJ9?2bx9E?BarY-eSBZ;eoA_>J+{Ei$h3>?%9W`I`%qglu zpAhP4b^*=Jygpv(4gw8JBF?4aPKyL6M;fJT`CsAF6F{!_M`ZeHsuZrLPzN!uXpp5t zN8Ie)y_&i!`56s!@ORnvUO$CyP%EP=XjX?xy36AcDAJ;cGii<|0NC@+RDUWDHE=B|`i zPvPi$`y$8KK^)Q8^Fn2t2*k8U)p%G(7#bqT7T$eogqdk`sx7zc84+~$6e!Uy)XGseMLJ%82#|=1bdFfIOUVbo&*z&85T`{kwruLO z|D-}N2HM~8G@QPw$g7Ju_(UZZ1GmMkXZFK8yOqB-y{UOxqVU$YYZItSpRcY9o>>ODrz;xlK{1n~Jf5;YK-nLk zctz|x-E&@Rp^%-Ii z^yNyW1O)xT2vdNdU#nIjq3<wkXJtDuS{z?gy+q0d*U|L->W7pdqa))tG)fl$6j{}kk3p7~Sq_UpRBXHVG!xpbp# zi5~GY7%02&KcB4oayZ@2FvA#}5~|Ad zs_5JRnz;X>?SHJ7A%~}*8sdNp%YM+Zj>>v7y#QoAb=%AY{Q1ZA{NsiHd@Fyy&;Rm5 z_Kj$wVvCegh#d4r4H$~d(HNp)%0FKT79fY;+9|!q=HN~Hi$l0aScvSpP6`r}v7HL2J?{Lyft&-K{t_flVB=Y7kHzYMr zGz$FwlKj7oKs#c9bFYR@83`RdWjYRp1%c1(-|6s&_`rMQPW{cb<-SAEze2(PPg?aj z2Hd)`AJlZ zC9xOk&OHXH-Ke;21HXGaYV_ zgicvt#t^}D3v0*Z!F?|zoLy8gn9Ppz%H1WNpu&Z+Oh%pQi4S7^V(ZGNHvgPI6H@mh}x zu@`zKOIaZ|0eC&Uu#?f|TbbFFbrE5g>c$r)tyRMyg#zUVQ!J=i2`MYvev!Y-XU&!z zKTy+ulgGJY-OGRFMql`R(@oU*<j+Cvt*C0k`r%oXOUeP))zeL*22Xw!tJp48 zK2X$t7o_!ww4%)`(v9%p4%Xj`e#QSYE4H1Fz$(``q$y&pNaFOF@zOboq_xni-MkXZ zvWYLVgi6*U^LxTP6yzU&*8R3Iie{EXhPP;*^R3i~C%oZ2PjLtt%3}q0^__;C-yKqz z9Umc37n_#g`3xjqgIJbs!vcj}FchJb?uDM-0_5EN3iLwHDfbq7+Nc)m)_gz}S@(d_ zBu$Qb_UGc{HhOBJ`XlJ~B1;EAI%kBR^%+G9dVzuy`AZ22T{wV(ZH5F7X&hi7TYDCLT zl#_Q$e4!iUT-NHz^);F6Tcmm~9%~d9?9~4$18nz2V02=M4F^$Ky*|T^rs-0ln4HNf zGBc;hlWy451C#f9Y6$CLe@&DHZ8{3UJ}7|?QGEVcKpPkb0Nt-wpypMuP&i?C9?z%u z>rwu-6j0uY>hwV@TqfF08Z^zVf!`;xZ7bd}0oO$_sG-=_jAky(udT%0_$T@HU|K9u%BU=>nxqVq)>ReT+^=zc zzn5c_iqp^$?z5v>j5d}IXhzM0o9>R`*qA*N(bweFYf8zc%q*-tTMIg6Bcl#nhZ3^%1Pm}f z!=D@tA^fd2^`orPy_;bth7D4`6aos83p$a$%QX+{dT@P(g|r^+bW`HsThK;PQ~XiS z`tgnjo(oF5MxbAGQd-b?+MlJMxe-#jPz6k1%8Tx25i`B0SY5aA=OUQ1PZb&eCNBoq zM=`IhA=g9%YI6Uw^mOfrDtU26Lm7a6X%{A@aJ%RqWJ4~I^(v)ArN-ru0@TzXM>Um4 zQU$mRUj>Bw#b5$s0Ho6j!2M{l;D;>8qT6PGKPX;4;bD3OSOCj^op-A}tYj^+T2wUpg4do?J6mpO55u6S1&0V8V0kC z##3y0rtGi}sxV?H1GPNWWF)u<3fsQldO$VnUpi?;>_`G8*_M@7v4dDCxxMJk^dQ#?cV9n&FnDUxY)sa>XL?bPD4rADB`Cb}33` z+SyIr2Q%^oxB8!#lCLC35%<8;lE}E&!7!DQAaoI*DYip#71+Nw0HBBPbHQTYBa>A@9N*D;il*DSd! zPjs&O5brAmEQ7MGD_QJ``qhOveQUyOJy4b@!BapbEDrMql0hqDEpYh7;J=x8(X_SwD*Wd0xS&aAIpjvq3ttPaJynlx<{eAI0lEW62dGa7q^nki|PB@~H`y zW6(Hg3e@fE0}UYIVBBhI4DD}yf!h9k7&OWFh3_#Z&Ms>HHsM9m5QYAb^WrLMRUR@t zC!|V0m`$a}C9Dg6-6#I!Op%G{U&~bayq?yRX3V#(f*)isg_E z==UY5p|U=Q^|S0HOdk0QzJgI&l8+_?I=cTuXWjr{67g9e?+LHjMlg}mHno=X>ljiz z>%K(5GUr-gT6spZ3S5_thO;My3Zr!);VdxbX}GKU>0ih|){G7UgHE5;P`G-|X(|O< z=Msr@jn8=Y+Db7XWK1mtavl@fsmiQ^fK1yHQaR!+=)>XlZ~|ap6LbFBZ9<%8`lvJ7 z=KnFN2>KyyfQNd~gAXK?2aIUh>7Br$`AdAkDl8cF19Pvm;pU~q%thspb<@u^y5q_L zlfK_;y^3lInyn!}Paueflt!gQxg}rma^k+fi=%1QiKO4evBJnA(7O8o^D@&#uAF1S z_<_jY$8>|YFjf-JZvdC*WJmozzA2FaW_|D(z}%JbG#5^j)xvzh%!~)^3#}z5LL$`H zlAD=y-cRd-I!dbiyWQca+vK@bI@`U5bXjP2-KA&UwK*J)pQ{z7A1P!ES z$7d*X7l^@j{(L$nsw5Q2O`z9z2?jqJw+HC^n85bpfNX;TwQ%ZY-=H%;at}&bJ9Y4l z6pc1#L-31NjeAW_T_^nDVhyxKfl;KZn?_kGa<`UdGk|6iB!ZRb>4swTy461|GvlnR zoj(13z>;>~YH8sT7=^si965&7V=$r694WlJyZe~lMyrJPgJ81Be>e{w`5d3IhoN`v z&%V>5{2S}Wnt8bb6%f#*eQIB(fvFazjajm9Ftne@PI%CkhQGNl2aJXBc%{>^Ft0v8 z1B7n5KYJ7hDI^8vGqucdbntyz#*DaV2M9`{LdZ-<$7~A0q`pf#SPd}4gqd4V#hLZ^s3L<|%5kX< z!H#q=7ClqpHhmln;R8k~9NO6Jli!F!c~|bTsyl4OAG(CC_IDhkUI%k}2e}rJJ?ZoZ z#$Fqu2+ZeV(=zZx;zBtU_LjGdIStaOAh5lfHkd(uDueF0Q$&(q2ESh$H^j}#Q=YD$7JY&k~Jd124oqdW|21a4B< z>N>t5s6QiZA*X?sDk%4b&ufT4N@iS(G>deWfM1uQ-X{SM`}@?#dVMMyp#&X;z_3PJ zL4Pr5S$=P!TljNh@@Fy6PqA%o(2 z!^n^c?SR)~DKR^Fw;kHbS6g%_Y7HY?N(pQG25Wq6v``qzoPRYJN_a}1SqjrXK%EIoFpebljf zKDC*OoJ?l>LKP=B;F$mg{9&aM0ZR^BvX6e5Fz*aB^V6{1T816r%*d)p{e9%%Y3B67 z1k2OIo1_5F^>rBuO+8(S*GkSzZzCIf0&{x|+{KcdE zsd~6SO@M5om{c7GCJl)h4PlR5@7%lUvYwJKfyHR*DbmP_HQbrp9# z;75vj{7BFPufiBrNCg>p@<~XZ62!AAxco3;5ai7vX!QMcrwDujydvTU!og*^~Z55e)u@k23A{m zN`_0h@zh7LCPOU&^MoKbJPhLvd@wEZYt^$0OS-f{jI^0$TvWUJXs$b_cgAO%^&)DUzeFDVds3mOj?8;;DsH$$qhjNqHa zi=(ka+>V#p+T)Jenis%$hR;cq(==B+Z)9A;!ga=k+gCK5B-5LmhU9ORpi$#*UYgHu zCZsP0rA9BAs|1a}8|0k#%nEMJ3HBxWGvgYXHcCGnH4f+N^#$P;*+n$&U4_pw>ToKL z2G7p!b8NVn6f$klQN(O08@@W?S{TiB-f;?iT88Rem{QPJwM(9T{LCaZXu2nl6&3J7 z6~BiZG=W&SPvvr|U*XZqTB8PRG-8YWO_!5ZQ$3Q#5zA!99$C#kBRIjY_C51QDEyjx z_QBLmpCtTS@wy;|aBd_k1gl=w*J3dFw&o3Mq4l7|aL;_XHi1n5-_NL(h<`glGaZ?J zJ<>QJKP#){ubio*;`$2&%r8bdxe2 zLv1j}mZ>7=Ij|B4N&aWNjA4-u&dg_TUftLD_)nOMMZ46fcvT+4a^G zjdb#SH(OxLiKo@s_m;U8Ketj%-D|Y6^=>ty7zHhlYG$EcUG15b!WUfS8^7sv*{LA- zBIfBkWJhGU7a~2ltw9UA!cw+KfUOSzT`);HbLsE;ublo4@kDf1AEA z&KfG?I7PRW&k=)%R0-vcv5u~Z8`n0it-$w(y(Uqk#9$;CZqka{37!384P03zB%6JCdm z9GI|KI5m>YU%(EI;05%-TQq`~DJLEd)=z6U8aDs^5<9;+S+t}mx?fu|R3}G~XFO?O zYeOg^x7ksq+X8yrHEL9yrfe1xX@cG}7D0D}cULxLfNKb9peUu8Oz(@&nKF`nfi}`c zbj-bt9af_)d}{WhvFH4O`lkn#*V7mf;=RR@e-?5oOuMD=W@ynR)IjKX3dS zhj6oKvXacyPF|n|FgVEx$x91_DC81{dWtz3B^)6M5{P-XXsdsIwRH(Tfbj(^Y?MAf z!&~f7s42DzZV_Hu0^H;oFsz*%j}=Hz_h;EmUbPDoH8PzQt8f@;Gsu35rj|Dk69yK- z_tjr*w_pFp&82(Wz%YrVZrB(lJ8C9Row5j;W)ViG?|KSB9Hz29S5xMM+3r|mMN#6- z3E3xd^ymrMF;&AUN#$W3s{lv&qS5Gg(wYZ^crr**B^!5}8OCz%l1ST@V(%9EZ24x6 znoNeLq^0@Sb3{0BTS0&T*6M42^1yBD$ID!6Vvl=H*~?WPBbtvUWM4I>5GEIIV~Nq$ zbBL|gUeq=_OaVi_Y3l%ue!n^grs?B-f-9wx;`E$~m64n#vT5UI0}p!Ow|5Q%x)CQF zp8vv!g>y@7BN@K3cmzh?z~^LPBCpoi4Xx)4C&Nr;@m#0>NQpnyy&!GdXI6OA#hc;u zk=*sTrKt02b657JdZ2PuYFeB3y+zE1laFI1 zEg+F}BN@ibk6T!ArpGZYr{tHmRO2G<2=i;{{Qn}PK!kErfTVJ5&==IYyCBBc|w-5_0imz*A zSExdDxmVj<=9e4IgzZUDgYHppLzRse^ULPTBnE5KuuldqL;#Z2FZJuCFz^}5bh}wn zbVkx_Qke%De7@)HL#&r}Vv|JN^+%>aZqEqz(8OSRu$UGKiR1+SJW*6uF4iAd`citL z`#cTl{7m$Avemrt&Vj}Ga<5|}r`48h==`9AW7NA?A6jRyIeHwC>ZJXn_s2$jP)SLHFJ`c~f=>0WZ}uy4z^568K)byQv#Iph zMOtYAPuyxs>_L6D5x#~ysqeV|73Wy_LiM4KIqOH3J%=_HN;&X;r?jL#_@yF=iB+ z!H-SS>-Z+8zu|Mwl=;Vby)t_cCDL^Wc0RI^0r>P~LEwWMK6j)g9`rRLS>LkY45YH8 zQYNW0-ZO>=#(52?l-XTPi>F3nt*MX8cZW|#>RL(+ej?!7m*67*qIV}8-I6L`v6}Tp zp%q3sJM{#_MO26-YPMDnX zC(G{f@e5kVV~EqPd&F(LTJY%Ae#bp8XZQ_VPeJDv)9-dcG+Q+Z>X-WIQ5!S8-`&M?=C5B!cv4wR3cpc%Oi&`ft$}@-&d16?%?L(EqwPfM_RT-w9?3$1=7vy$n%xtHOVWmTJboG;VzSz=i!SfipJCXFTM*M@y z>JL*NHrDw>9a24Z_#Kb>*hpgFRYulfvzDILJ1Ox2!7S?KO-cOs=GWi)lgXZm;hIHe zZW{ufH&9=S9X2*r$++^SV=cV)7eg$|Kya z`kc%7rD?iUeBB5vSMIhEdm28xcjDBiUml%H{o|@@^>4<3pVuc%`3K#;8n

Z5-0 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 diff --git a/fetchTltData.js b/fetchTltData.js deleted file mode 100644 index e69de29..0000000 diff --git a/main.js b/main.js index d418bf1..09f876a 100644 --- a/main.js +++ b/main.js @@ -1,8 +1,7 @@ -let serverPort = 80; +const serverPort = 8081; const url = "http://transport.tallinn.ee/gps.txt"; const express = require('express'); -const { fstat } = require('fs'); const app = express(); const http = require('http'); const server = http.createServer(app); @@ -10,8 +9,18 @@ const { Server } = require("socket.io"); const io = new Server(server); const axios = require('axios'); const fs = require('fs'); +const path = require('path'); -let cafTramTakArray = ["502", "520", "505", "518", "513", "507"]; +const localFilePath = 'gps/gps.txt' + +let cafTramTakArray = ["501", "502", "503", "504", "505", "506", "507", "508", "509", "510", "511", "512", "513", "514", "515", "516", "517", "518", "519", "520"]; +let pesaTramTakArray = ["521", "522", "523", "524", "525", "526", "527", "528", "529", "530", "531", "532"]; +let electricBusTakArray = ["1350", "1351", "1353", "1356", "1357", "2411", "2413", "2414", "2416"]; +let kt6tmTramArray = ["96", "97", "98", "99", "102", "103", "109", "110", "114", "123", "131", "148"]; +let kt4suTramArray = ["104"]; +let kt4tmrTramArray = ["136", "138", "140", "141", "142", "168"]; +let kt4dTramArray = ["157", "161", "170", "172", "173", "176", "177", "178", "179", "180"]; +let kt4tmTramArray = ["181", "182"]; let requestedType = "Unfetched"; let requestedLine = "Unfetched"; @@ -21,131 +30,227 @@ let requestedTak = "Unfetched"; let vehicleType = "Unfetched"; let requestedLatLong = "Unfetched"; -console.log("Server initalize!"); +let isRequestMode = false; +let requestModeIntervalId = null; +let lastFetchTime = 0; +const defaultFetchInterval = 120000; +const requestModeInterval = 30000; +const requestModeDuration = 120000; -app.use(express.static('client')) +console.log("Server initialized!"); + +app.use(express.static('client')); app.get('/tltmap', (req, res) => { - console.log("Requested / (index.html). Fetching!"); - //index.html - res.sendFile(__dirname + '/client/index.html'); + res.sendFile(path.join(__dirname, 'client/index.html')); }); app.get('/img/marker.png', (req, res) => { - var img = fs.readFileSync('./client/marker.png'); - res.writeHead(200, {'Content-Type': 'image/png'}); + const img = fs.readFileSync('./client/marker.png'); + res.writeHead(200, { 'Content-Type': 'image/png' }); res.end(img, 'binary'); }); server.listen(serverPort, () => { - console.log("Apache server initalized..."); + console.log("Apache server initialized..."); console.log('Server started on port', serverPort); - //triggerDataFetch(); }); io.on('connection', (socket) => { - socket.on('takSearch', (tak) => { - try { + socket.on('takSearch', async (tak) => { + try { console.log("Input tak: " + tak); - fetchData(tak, socket); - } catch { - + saveRequestLogs(socket, tak); + if (isRequestMode) { + const currentTime = Date.now(); + if (currentTime - lastFetchTime >= requestModeInterval) { + await fetchAndSaveData("Request Mode"); + } + } else { + await fetchAndSaveData("Request Mode"); + } + if (isRequestMode) { + clearInterval(requestModeIntervalId); + } + startRequestModeFetch(); + fetchDataFromLocalFile(tak, socket); + } catch (error) { + console.error("Error processing takSearch:", error); } }); }); -async function triggerConstantDataFetch() { - while (true) { - console.log("Fetching new data..."); - await fetchData(); - console.log("Data fetch completed. Wait 5 seconds before next fetch!"); +function saveRequestLogs(socket, takInput) { + const xForwardedFor = socket.request.headers['x-forwarded-for']; + let clientIp; + if (xForwardedFor) { + clientIp = xForwardedFor.split(',')[0].trim(); + } else { + clientIp = socket.request.connection.remoteAddress; + } + const date = new Date(); + const logData = `${clientIp} - [${date}] - [SEARCH ${takInput}] - ${socket.handshake.headers['user-agent']}\n`; + writeToLog('search_log.txt', logData); +} + +function writeToLog(logfile, logdata) { + var realLogFile = path.join('logs/', logfile); + fs.appendFile(realLogFile, logdata, 'utf8', (err) => { + if (err) { + console.error('Error writing to file:', err); + } + }); +} + +async function fetchAndSaveData(fetchMode) { + try { + console.log(`Fetch started (${fetchMode})`); + const date = new Date(); + const timestamp = date.toISOString().replace(/:/g, '_').replace('T', '-').split('.')[0]; + const logData = `${date} - Fetching new data (${fetchMode})...\n`; + writeToLog('fetch_log.txt', logData); + + if (fs.existsSync(localFilePath)) { + const oldFilePath = `gps/gps-${timestamp}.txt` + fs.renameSync(localFilePath, oldFilePath); + } + + const response = await axios.get(url); + if (response.status === 200) { + fs.writeFileSync(localFilePath, response.data, 'utf8'); + console.log("Fetch completed."); + const logData = `${date} - Fetching completed (${fetchMode})!\n`; + writeToLog('fetch_log.txt', logData); + } else { + const logData = `${date} - Fetching failed (${fetchMode}). Got: ${response.status}\n`; + writeToLog('errors_log.txt', logData); + } + lastFetchTime = Date.now(); + } catch (error) { + const date = new Date(); + const logData = `${date} - Error fetching data (${fetchMode}): ${error.message}\n`; + writeToLog('errors_log.txt', logData); } } -async function fetchData(takInput, socket) { - try { - const response = await axios.get(url); - if (response.status === 200) { - const lines = response.data.split('\n'); - let takFound = 0; - lines.forEach(line => { - if (line) { - const data = line.split(','); - if (data.length >= 9) { - try { - const transportType = parseInt(data[0]); - const lineNumber = parseInt(data[1]); - const longitude = parseInt(data[2]) / 1000000; - const latitude = parseInt(data[3]) / 1000000; - const tak = data[6]; - - let transportTypeDecoded; +function startPeriodicDataFetch() { + fetchAndSaveData("Normal Mode"); + setInterval(() => { + if (!isRequestMode) { + fetchAndSaveData("Normal Mode"); + } + }, defaultFetchInterval); +} - switch (transportType) { - case 1: - transportTypeDecoded = "TROLL"; - break; - case 2: - transportTypeDecoded = "BUS"; - break; - case 3: - transportTypeDecoded = "TRAM"; - break; - case 7: - transportTypeDecoded = "NIGHTBUS"; - break; - default: - transportTypeDecoded = "Unknown"; - break; - } - if (tak == takInput) { - if (transportTypeDecoded == "TRAM") { - if (cafTramTakArray.includes(tak)) { - vehicleType = "CAF Urbos (Spain) (Overhead 600V, Motor 264 kW) 70km/h TOP"; - } - else { - vehicleType = "-- INFO UNAVAIL. --"; - } - } - else { - vehicleType = "Unfetched"; - } - takFound = 1; - requestedType = transportTypeDecoded; - requestedLine = lineNumber; - requestedLat = latitude; - requestedLong = longitude; - requestedLatLong = String(latitude) + " " + String(longitude); - requestedTak = tak; - console.log("Requested data fetched:"); - console.log("Transport Type:", transportTypeDecoded); - console.log("Line Number:", lineNumber); - console.log("Latitude:", latitude); - console.log("Longitude:", longitude); - console.log("Merged coordinates:", requestedLatLong); - console.log("TAK:", tak); - console.log(); - socket.emit('takResults', requestedType, requestedLine, requestedLat, requestedLong, requestedTak, requestedLatLong, vehicleType); - } - else if (tak != takInput && takFound != 1) { - takFound = 0; - let busNotFoundText = "BUS NOT FOUND!"; - requestedType = busNotFoundText; - requestedLine = busNotFoundText; - requestedLat = busNotFoundText; - requestedLong = busNotFoundText; - requestedTak = busNotFoundText; - } - } catch (error) { - console.log("Invalid data format!", line); +function startRequestModeFetch() { + isRequestMode = true; + requestModeIntervalId = setInterval(async () => { + const currentTime = Date.now(); + if (currentTime - lastFetchTime >= requestModeInterval) { + await fetchAndSaveData("Request Mode"); + } + }, requestModeInterval); + setTimeout(() => { + clearInterval(requestModeIntervalId); + isRequestMode = false; + }, requestModeDuration); +} + +async function fetchDataFromLocalFile(takInput, socket) { + try { + const data = fs.readFileSync(localFilePath, 'utf8'); + const lines = data.split('\n'); + let takFound = 0; + lines.forEach(line => { + if (line) { + const data = line.split(','); + if (data.length >= 9) { + try { + const transportType = parseInt(data[0]); + const lineNumber = parseInt(data[1]); + const longitude = parseFloat(data[2]) / 1000000; + const latitude = parseFloat(data[3]) / 1000000; + const tak = data[6]; + + let transportTypeDecoded; + + switch (transportType) { + case 1: + transportTypeDecoded = "TROLL"; + break; + case 2: + transportTypeDecoded = "BUS"; + break; + case 3: + transportTypeDecoded = "TRAM"; + break; + case 7: + transportTypeDecoded = "NIGHTBUS"; + break; + default: + transportTypeDecoded = "Unknown"; + break; } + if (tak === takInput) { + if (transportTypeDecoded === "TRAM") { + if (cafTramTakArray.includes(tak)) { + vehicleType = "CAF Urbos AXL (Spain) (Overhead 600V, Motor 264 kW) 70km/h TOP"; + } else if (pesaTramTakArray.includes(tak)) { + vehicleType = "PESA Twist 147N"; + } else if (kt6tmTramArray.includes(tak)) { + vehicleType = "Tatra KT6 TM"; + } else if (kt4suTramArray.includes(tak)) { + vehicleType = "Tatra KT4 SU"; + } else if (kt4tmrTramArray.includes(tak)) { + vehicleType = "Tatra KT4 TMR"; + } else if (kt4dTramArray.includes(tak)) { + vehicleType = "Tatra KT4 D"; + } else if (kt4tmTramArray.includes(tak)) { + vehicleType = "Tatra KT4 TM"; + } else { + vehicleType = "-- Info unavailable --"; + } + } else if (transportTypeDecoded === "BUS") { + if (electricBusTakArray.includes(tak)) { + vehicleType = "Solaris Urbino IV 12 Electric"; + } + } else { + vehicleType = "-- Info unavailable --"; + } + takFound = 1; + requestedType = transportTypeDecoded; + requestedLine = lineNumber; + requestedLat = latitude; + requestedLong = longitude; + requestedLatLong = `${latitude} ${longitude}`; + requestedTak = tak; + console.log("Requested data fetched:"); + console.log("Transport Type:", transportTypeDecoded); + console.log("Line Number:", lineNumber); + console.log("Latitude:", latitude); + console.log("Longitude:", longitude); + console.log("Merged coordinates:", requestedLatLong); + console.log("TAK:", tak); + console.log(); + socket.emit('takResults', requestedType, requestedLine, requestedLat, requestedLong, requestedTak, requestedLatLong, vehicleType); + } else if (tak !== takInput && takFound !== 1) { + takFound = 0; + const busNotFoundText = "VEHICLE NOT FOUND!"; + requestedType = busNotFoundText; + requestedLine = busNotFoundText; + requestedLat = busNotFoundText; + requestedLong = busNotFoundText; + requestedTak = busNotFoundText; + } + } catch (error) { + console.log("Invalid data format!", line); } } - }); - } else { - console.log("Data fetch fail! Got status:", response.status); - } + } + }); } catch (error) { - console.error("Error fetching data:", error); + console.error("Error reading local file:", error); } -} \ No newline at end of file +} + +startPeriodicDataFetch(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 0c68d68..e4e08ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -247,9 +247,9 @@ } }, "node_modules/engine.io": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", - "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -260,7 +260,7 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "engines": { "node": ">=10.2.0" @@ -840,12 +840,12 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", - "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dependencies": { "debug": "~4.3.4", - "ws": "~8.11.0" + "ws": "~8.17.1" } }, "node_modules/socket.io-adapter/node_modules/debug": { @@ -981,15 +981,15 @@ } }, "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -1182,9 +1182,9 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "engine.io": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", - "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "requires": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -1195,7 +1195,7 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "dependencies": { "cookie": { @@ -1620,12 +1620,12 @@ } }, "socket.io-adapter": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", - "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "requires": { "debug": "~4.3.4", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "dependencies": { "debug": { @@ -1707,9 +1707,9 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "requires": {} } } diff --git a/rollback b/rollback deleted file mode 100644 index 2b7f884..0000000 --- a/rollback +++ /dev/null @@ -1,285 +0,0 @@ -let serverPort = 3000; -const url = "http://transport.tallinn.ee/gps.txt"; - -const express = require('express'); -const { fstat } = require('fs'); -const app = express(); -const http = require('http'); -const server = http.createServer(app); -const { Server } = require("socket.io"); -const io = new Server(server); -const axios = require('axios'); -const fs = require('node:fs'); -var sleep = require('sleep'); - -console.log("Server initalize!"); - -app.get('/', (req, res) => { - console.log("Init root /"); - //index.html - res.sendFile(__dirname + '/client/index.html'); -}); - -server.listen(serverPort, () => { - console.log("Apache server initalized..."); - console.log('Server started on port', serverPort); - triggerDataFetch(); -}); - -io.on('takSearch', (socket) => { - -}); - -async function triggerDataFetch() { - while (true) { - console.log("Fetching new data..."); - await fetchData(); - console.log("Data fetch completed. Wait 5 seconds before next fetch!"); - await sleep.usleep(5000000); - } -} - -async function fetchData() { - try { - const response = await axios.get(url); - if (response.status === 200) { - const lines = response.data.split('\n'); - lines.forEach(line => { - if (line) { - const data = line.split(','); - if (data.length >= 9) { - try { - const transportType = parseInt(data[0]); - const lineNumber = parseInt(data[1]); - const longitude = parseInt(data[2]) / 1000000; - const latitude = parseInt(data[3]) / 1000000; - const tak = data[6]; - - let transportTypeDecoded; - switch (transportType) { - case 1: - transportTypeDecoded = "TROLL"; - break; - case 2: - transportTypeDecoded = "BUS"; - break; - case 3: - transportTypeDecoded = "TRAM"; - break; - default: - transportTypeDecoded = "Unknown"; - break; - } - console.log("Transport Type:", transportTypeDecoded); - console.log("Line Number:", lineNumber); - console.log("Latitude:", latitude); - console.log("Longitude:", longitude); - console.log("Decoded address:"); - console.log("TAK:", tak); - console.log(); - } catch (error) { - console.log("Invalid data format!", line); - } - } - } - }); - } else { - console.log("Data fetch fail! Got status:", response.status); - } - } catch (error) { - console.error("Error fetching data:", error); - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - Bus Location Finder - - - - -

Bus Location Finder

- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -let serverPort = 3000; -const url = "http://transport.tallinn.ee/gps.txt"; - -const express = require('express'); -const { fstat } = require('fs'); -const app = express(); -const http = require('http'); -const server = http.createServer(app); -const { Server } = require("socket.io"); -const io = new Server(server); -const axios = require('axios'); -const fs = require('node:fs'); -var sleep = require('sleep'); - -console.log("Server initalize!"); - -app.get('/', (req, res) => { - console.log("Init root /"); - //index.html - res.sendFile(__dirname + '/client/index.html'); -}); - -server.listen(serverPort, () => { - console.log("Apache server initalized..."); - console.log('Server started on port', serverPort); - //triggerDataFetch(); -}); - -io.on('connection', (socket) => { - console.log("Got connection from user! Waiting for taksearch...") - socket.on('takSearch', (tak) => { - console.log(tak); - console.log(triggerDataFetch(tak)); - }); -}); - -function triggerDataFetch(tak) { - console.log("Fetching new data..."); - const data = fetchData(); - console.log("Data fetch completed."); - const filteredData = data.filter(item => item.tak === tak); - return filteredData; - //await io.emit('takSearch', filteredData); - // this part is only for when it is continuous - //console.log("Data fetch completed. Wait 5 seconds before next fetch!"); - //await sleep.usleep(5000000); - // also add while true cycle -} - -function fetchData() { - try { - const response = axios.get(url); - if (response.status == 200) { - const lines = response.data.split('\n'); - const result = []; - lines.forEach(line => { - if (line) { - const data = line.split(','); - if (data.length >= 9) { - try { - const transportType = parseInt(data[0]); - const lineNumber = parseInt(data[1]); - const longitude = parseInt(data[2]) / 1000000; - const latitude = parseInt(data[3]) / 1000000; - const tak = data[6]; - - let transportTypeDecoded; - switch (transportType) { - case 1: - transportTypeDecoded = "TROLL"; - break; - case 2: - transportTypeDecoded = "BUS"; - break; - case 3: - transportTypeDecoded = "TRAM"; - break; - default: - transportTypeDecoded = "Unknown"; - break; - } - - result.push({ - transportType: transportTypeDecoded, - lineNumber, - longitude, - latitude, - tak - }); - } catch (error) { - console.log("Invalid data format!", line); - } - } - } - }); - return result; - } else { - console.log("Data fetch fail! Got status:", response.status); - return []; - } - } catch (error) { - console.error("Error fetching data:", error); - return []; - } -} \ No newline at end of file diff --git a/tltmapout.txt b/tltmapout.txt deleted file mode 100644 index 01d2554..0000000 --- a/tltmapout.txt +++ /dev/null @@ -1,8 +0,0 @@ -get url transport.tallinn.ee/gps.txt -3,2,24786250,59429980,,302,98,Z,146 -a,b,c,d,,f,g -a= 3: tram ; 2=bus ; 1: troll -b= line -c= long -d= lat -g= TAK \ No newline at end of file