From 444ca94669d68f86c26766e94a43825dc4b973f5 Mon Sep 17 00:00:00 2001 From: emile Date: Wed, 11 Sep 2024 16:40:04 +0300 Subject: [PATCH] new --- osinaweb/db.sqlite3 | Bin 1974272 -> 1974272 bytes .../__pycache__/consumers.cpython-310.pyc | Bin 17737 -> 17956 bytes .../__pycache__/routing.cpython-310.pyc | Bin 586 -> 569 bytes .../api/__pycache__/views.cpython-310.pyc | Bin 1965 -> 3236 bytes osinaweb/osichat/api/views.py | 54 +++++++++++++++++- osinaweb/osichat/consumers.py | 15 ++++- osinaweb/osichat/routing.py | 2 +- .../__pycache__/models.cpython-310.pyc | Bin 16771 -> 16933 bytes .../add/__pycache__/views.cpython-310.pyc | Bin 16598 -> 16589 bytes osinaweb/osinacore/add/views.py | 1 - .../edit/__pycache__/views.cpython-310.pyc | Bin 12541 -> 12528 bytes osinaweb/osinacore/edit/views.py | 3 +- .../0107_remove_staffprofile_active.py | 17 ++++++ ...remove_staffprofile_active.cpython-310.pyc | Bin 0 -> 594 bytes osinaweb/osinacore/models.py | 4 +- .../js/osichat-admin/inner-conversation.js | 11 ++-- 16 files changed, 91 insertions(+), 16 deletions(-) create mode 100644 osinaweb/osinacore/migrations/0107_remove_staffprofile_active.py create mode 100644 osinaweb/osinacore/migrations/__pycache__/0107_remove_staffprofile_active.cpython-310.pyc diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index 08fad1ba7dd81394386c93b2a5a4c19012230d44..cf10a276a0a6c9683a4164475c9aff52bd228548 100644 GIT binary patch delta 857 zcmajcOH9*X902g|+d8%m`jyuhFwhYm#=(}hP_`~Ym?juU1|h}>CT1(p;SeZ~2Jn%% zY|5?@f<3x;+#o}V)I<+>(uf)`QDZdWanazx0~b!{2ZqGx!Nc$HeaZhFU73omOx-Qb zPgMZ`w|@g!01(_v9j8lGJq%r~gO;V&b>B`G3Qm@_vz(W4ds)F%?`D`rX6dEe%$OGd zj_jmA&_TcdGRPojTf3Vvp}<68jm5=`cM;UN5DS^8Z600(anXzmvM_ZMtom*w3iDS41Cv!9^ zD|lJn#jw1<2-^A&idiJg&p=o;BvFOVys6eC(Sr6qiN2BtS*vDS(sswez>+j6y5(Vh zbdVoW`lX3}MHo?rCdYf-A}0-A2}7kyAAoAK)@)BW(g>q9M>_YTLQw^Pf*C-!qB*Ko zL-sraRf$s<8?Az%yJJzronb!j~xErmega;yjRn%ylGedw5wp*RY<%u zg&_f;0}^v4%iio_re^k3x;oJTEm)D(0j-bU!po{*&H7YFNAIm$8@0VPYi%|Rsn37H zGOgu{)vqrSoE-n>&G9Dcp^`{$Sg~TP1S{2&8@9g9B9aOLIztbjee?v~L;|%-rKr$S zUbL0+pN&}z;CP$wsCS8B8Fz3@8j>fZ;J6}&!y{vII5H>&#a<;cA^mlSMlavs5EAUa|cP DT2~Ah delta 678 zcmY+=Pe>F|90&0CW@mL~-S@_IcOBPtVKyzyKf{}u-PxT%MLPruvUrsaCW2(t5P2|) zT3mFmmB^!0OVGhlS!2;Dy4b0}42!5kg6Sb-J9O~kY3q>`^x*U0{T^R<@0;J6&2P;< zXl+`q0ss$BfjR(q?O~73Emxn9U+aO9%DbMU3z2NEK@^SHTEG2J5NECp?2DjrD?RUgMB!K9jqsG=HI^c-y zbj=Z4`3w|5aoZ7@0Moz(y=@0o@3#q}PV`hS`S+=;O)S+)X<6O$KKw*voo8>EqW%(2 z(#{fIg9qNH5Z diff --git a/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc b/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc index fa12059bd284a56d783a18731d349711506bd665..1168c1352a9e2bfa8d46f5fea1cf2f398fcf218a 100644 GIT binary patch delta 1928 zcmZuxYitx%6rMA?JNqtucX!)bwlBLa-Bwy?X{l|gLShsIjoLz7*WPWrgWclY0Row( z3Nb3N26F={6tgw{F;-$-Ma2drKv6+NBx;rjDM3-A(fIgb)WmaU`|yXG%s1ct&gC0z_ucR*GJG9K% z{J>CQj`>u+q03+M`<~U+;NFHM@^WEyj=V#MERh^$j7DT9h44{Ek9-^y^5$- zfYhUUcLToj@$v1JY0HU1+B%c&kpga!RoYd>w_!8*4upV-ZzR4GA?0LYEfP|PqOk}| zK`2lpx=VYSQkl_sD7;l0h{UvLFM6<)qiZ0n-4z*pIKq3Jy~sm@#)7Y)Ttx)M;*HYo z;Bur2K;Awto~wRFw6=qf%ec`A-wgQ;E>o>zu2YAszY_Ei84)e9p@x zHxo>V$t;g}wjraF*Wfy3?T=_-P2IT zElTqI;?IVv+H15l_B=prnBaQ?V`^Qq#|q&G8RjR&+QwqXCA2okk`&)5wl-EMHgNoH zR+29@TA=A23cL>i=bReED+%VC!QUp6%qvJW%JmWZNu-vQz=U|c-6OJ>*IACBxGTAO z`F^N5O7?dNRujyormriVe49miJKDpY*NR3zZ)rP3M>S*Tff6U#F!}^L=rlr7B&d+$fUYnhn2+K;{1iG|OV-?Kh00IJmm14A zAz*oW@v8(2E%;D8(0;FRMM1>~xGHAai!JBS>#wA#BM%CU&tmr0jhQlne-w3{E%1v_ zJC|Ve^PQ_K=P@KlTY4DdaRMoGy`5KRKO>)1Ek0;TOeZSGB#uW|c;49kzAJ>s=A}7X?!U)&Kwi delta 1661 zcmZuxYiv|i5WZ)3@7;HwyM1i8wA(J#EoBRqzH}{XTTCQce`rujlXcVE$8PDvv)72^ zmPQ+5#MWRYkQmn3CdMCZESBYAMX*qfRG?sxq*+MSiW(K7{P3rbncEjXxXJm>%y(wa zoHH}$emKHr53sa;yWJw-cjcp0=kfvoq?XK-A zi>9eU$kwNq1)5bMYU6E)x+8*YCM}wNM0j71YZ-k8;z?36QOb&D4>O!Ia5#o_4E@KP z;{p?8;W@!)fk;V{m|`Jc4t!VA3f-kU++IAD#2hS#NzB9?x?&s#W?_;}(!-t7RyF|% zlZVO4h}SH!qYx`Uz)r)z~xR>6wud}2~!*DD<{g*aNjNbohhQ*lYULgE~RHXd?)Oya8q5=<10yVw-`;orh8LUCm+>q)*?`6gp?@WZAy_8vUGx!53!aXmyf7YwDV zCfO(p!}>vsYKmqIT2(9WSFKSSj!Ya`II?+!FzQ&Dqs~4i3$iJ0P|dPAAgC6;PqjpI zRLfZIIBL;6*%H^|nl&Kw8L)nuq#DQaRr5Gw!pl!$Wn4-@)NPY(s-zladt9#+Li!`Q zL&ueMa;7TES);l^Dmt2txzWldXUBEpOimxg4XBVR8!M6>$T)j+d>XxSR=oQ1RUN;s z>Y~N`GV-~rydAZ?RZT)Ie??n~wDUose6AMWN-3vm`wUt&Qd#ZYVI{=-`+GyZ9kE!r zt0Tr2$S6UulPvZ81(IJP*bn-ur(M%1rc9AoDAJ1#T9S2>`qw3i*&r-Pu zh_4~2CFmuXC#WMxz+`6Lc5Q!7`hJ9zv8zJ~D+yprv}f z!SatmOukkvGIj!nYMj>9T=3)YL5-9B4kv4hB#qq$lZDxEx294|;vRdFp4!7qI!(b& z!r404eXh4*v93h=6_@sw!a+wKl+?Gomi8cX6TuyVrHkRdxiAnA;Y_`o{R!uTdEzNt z9ZCLOe~^`(CBq#E_+C>auO0D6Qt6TMPa*Nx!%Gpp6ft}G=KgM_cQ@}MlfS?ac!(vS zB9P}?P4okfk!97QX!*QHDHA_O_Y=uufgmgUl6IoQaQbOrzua7r?>p8xa5nhZ1=!k9 zZKvM~HsE?Pn}OFGoYD;v6A*7G#5ez0gO}Zex%v|EJks+?X{(WyeM1&nkT#Ss2u=JJ z!P?!wf~w&2YlWc%N^mr2lQi#J@Lx@#IEya#k_$m6%heu&eyLBjrqOo#4J?h1vb(UY zu>v!5uE`6B8`p`K(9H}}jT8236mvQE3!pUlb1xGUA?QT#8M%?~#YRV3UX rHn)4J)j0JEKSe-kVoGjip1w_SNs(1?YH@L9 OeqMZLirvOf?u-CZxfM z`#A4Djqc&^pT1V!7Y_H%@EY@wcfLhyJnTG2BHpz~#Cyjm-udPF4;SxTuGztAgiWO8 zp&&h=1EA^yU<&0pCmeIK!Pm|Wx~AN@!Ao4@_t0nkC87vNgJ(p zvuS!J8l)1Uh$9^yt8_g6NS5PlB4h~O@)Z-pNhcH8HA@?jnpE<2vwp*{2X9-W3pvr9 zGoccj#DtVRquv1)Q`t90tTGuY?OHhuthoG~y|fC9=T`eBSXRdTF7YuX44ao?|Ifge zZvp(TYMUOmfo!$+p%05hp&BZF4HdtEMw&WvvWJ#LIXTUt+T7XTr2{rD*ih&MRcxi4 z8rrfUOP9M)Z0{N345SaztKDYp+O@A**TD^XhJFZ^Otm3sScB~r<*kjg^i;>9PVF^l zuyHVIQ1?G*#M|}C%exuu_5>Xxid1ht$7tzew20J>>ev2uAUEU$G4v_opnKvUH*$u- zV|V@?c(lMHv>vUsjn-JVp0unr$QhoYI6BgucQ4d=DYHeYva(odX1bd37&l`By^t!I zW$Jv(QLaN9hf71X!m2Mbk&^tQTc@^4y7!m_91pD zKNgjCDkXL6@avKI($p#r>@W`lWsDOzN2)!0{W2~eLY86YMe*QF@*RT(BgmMjOu^MU zGyqkQKw}|yVYRYc-hofu-+GVA0#04o_L$#D^*%5{df3Mi4oQgngkpMYh!OfXxn+!C zVlK;H%>DmY&yDas?0*yCyTHklfy Q(7rwiu delta 83 zcmZ1?xt5v0$QhK3fV;FoP!V#v_kd8HFY09ddPT>t<8 diff --git a/osinaweb/osichat/api/views.py b/osinaweb/osichat/api/views.py index cb5eded2..878a28ce 100644 --- a/osinaweb/osichat/api/views.py +++ b/osinaweb/osichat/api/views.py @@ -14,7 +14,6 @@ def get_chat_rooms(request): - @api_view(['GET']) def get_visitors(request): start_date = request.query_params.get("start_date") @@ -57,6 +56,57 @@ def get_visitors(request): - +@api_view(['GET']) +def get_staffs(request): + staffs = StaffProfile.objects.filter(user__is_active=True).all().order_by('user__first_name') + for staff in staffs: + staff_data = { + "id": staff.id, + "first_name": staff.user.first_name, + "last_name": staff.user.last_name, + "image": staff.image.url, + "last_seen": staff.get_last_seen + } + + return successRes(staff_data.data) + + +@api_view(['GET']) +def start_conversation(request): + try: + token_data = verify(request.headers.get("Authorization")) + user_id = token_data['userid'] + user = User.objects.get(id=user_id) + + start_with_id = request.data.get('start_with') + start_with = get_object_or_404(User, id=start_with_id) + chat_title = ( + f"Chat created by {user.first_name} {user.last_name} " + f"with {start_with.first_name} {start_with.last_name} " + f"on {timezone.now()}" + ) + + room = ChatRoom.objects.create( + name=chat_title, + created_by=user, + date_created=timezone.now(), + ) + ChatMember.objects.create( + member=user, + room=room, + date_joined=timezone.now() + ) + ChatMember.objects.create( + member=start_with, + room=room, + date_joined=timezone.now() + ) + return successRes({'room_id': room.id}) + except TokenError as terr: + return errorRes(msg=str(terr), status=450) + except Exception as e: + return errorRes(str(e)) + + diff --git a/osinaweb/osichat/consumers.py b/osinaweb/osichat/consumers.py index 6e1d942a..63a42aaa 100644 --- a/osinaweb/osichat/consumers.py +++ b/osinaweb/osichat/consumers.py @@ -328,8 +328,9 @@ class OsitcomChatRoom(WebsocketConsumer): def connect(self): self.domain = 'https://osina.ositcom.com' self.session_id = self.scope['url_route']['kwargs']['session_id'] - self.visitor = Visitor.objects.filter(session_id=self.session_id).last() - if not self.visitor: + if self.session_id: + self.visitor = Visitor.objects.filter(session_id=self.session_id).last() + if self.session_id and not self.visitor: self.close() if self.scope['url_route']['kwargs'].get('chat_id'): #Case where admin is accessing a specific conversation between the conversations of this visitor @@ -341,11 +342,19 @@ class OsitcomChatRoom(WebsocketConsumer): else: self.chat_room = None + if self.scope["user"].is_authenticated: #If a user add him as a chat_member + self.chat_member = ChatMember.objects.filter(member=self.scope["user"]).last() + if not self.chat_member: + self.chat_member = ChatMember.objects.create( + room=self.chat_room, + member=self.scope["user"], + date_joined = datetime.now() + ) if self.chat_room: self.group = f"{self.session_id}_{self.chat_room.id}" else: - self.group = self.session_id + self.group = self.session_id #Visitor hasn't started a chat yet, when he will we will remove him from this group and add it to the chat group async_to_sync(self.channel_layer.group_add)( self.group, self.channel_name diff --git a/osinaweb/osichat/routing.py b/osinaweb/osichat/routing.py index 98c64466..c2db6e69 100644 --- a/osinaweb/osichat/routing.py +++ b/osinaweb/osichat/routing.py @@ -5,7 +5,7 @@ websocket_urlpatterns = [ path("ws/osichat/visitors/", OsitcomVisitor.as_asgi()), path("ws/osichat/", Osichat.as_asgi()), path("ws/osichat//", OsitcomChatRoom.as_asgi()), - path("ws/osichat-admin///", OsitcomChatRoom.as_asgi()), + path("ws/osichat-admin//", OsitcomChatRoom.as_asgi()), path("ws/visitors/osichat-admin//", OsichatVisitor.as_asgi()), ] \ No newline at end of file diff --git a/osinaweb/osinacore/__pycache__/models.cpython-310.pyc b/osinaweb/osinacore/__pycache__/models.cpython-310.pyc index 7628bd7ba7da45cc66a1d340f811ea00dd3b6b4f..c7a34dbb8f74a0daa9042c1a0f49284f3d807b53 100644 GIT binary patch delta 1043 zcmZ9LUr1AN6vyw`++~}a&iQ9^)6|@9S4C3H)YJ?Oq9_W3>K2%Jx15QS-(40~qA7@$ z{n;u1rO+RW^2xeXFvubb3MqOi#Fy};DC(i;A$qCv(;)R;&Sz)me9t+*-;dwz?S)%? z5Ersq%>q4N1{MO9+wR4cr_`DilcJ~BJfxT7lvu^mC&=;rLI4!264z&xZT|_sF8l>9tmh*o6?{(hW!lN% zc8;SQjU4AOWKZ{=A-A7QbrOt%4Qybc*9Jzg=yWDC=o0L}&R};=I_9M=q+TM~G}rUv z<$60QNpXo3X;|a(Llkej%HoG9{fLYWa12w{i3ay?7>=Zk!Yq!Zb-+0GIGiwos6$w}~{grfV0?%d2@EJd4K1{yM zhg{(}$#I@z9Pek98b-){g5R?8X;61g5?-t}Vd>guu{_QcjtSIfSHKUf&Q>gwJTOSu zDVY(fTo^5g7Z;@yn3e5J=J`Klsz~6wPXac%cs5?oG+1!XvnOL&XA-e2j{oa(^FD^B z6cn}Q90|aUk=)&`RYj}yFGz3GTwW`H2YtTnE0*8o+XNXn<9o0o%E!E+GM{!;5&;VF zM&8dAg6sLYuwHwaZ-r$$G`y#hD(zQ6h9356&UMuQM{sY^z7>_xqOIc63ei}+8@6b2 z@hm_O=9Y}Wac!pLG(beFEHwg*;g$_E^u@%KO*{;Kbk;G5#-|5j_Rj-~6Ng*O#JGQX3IUpTgS Rj8X1QVzlNONO)kg?=KPh4SoOs delta 903 zcmZ9KT}YEr7{}jdUu<)mbMDi*rPG|Ru1HhU)--V!g%C&vvAocFUr8&3cP3%CRtJRS)ABUB~x@r9Sr@O3I$F$*P$QBQiot3OInPA?hnhh0?(PJx2z-OJ38G<8hv`$(x-BXM*ZZ*t{rkXMyB_a0*LrC?|591n*2km ze@<~CzX~eI@B9UTEBLx#5YCg@!b<>A@~KD-Fo>)BW}pkli|^a|=*jmK63-m?7;+ef z@Lb6W7$@^3tpIm1=syX4c*h@v+vJOr+ZKtoEP*}|Vm+7# a7WPIZ_V}b&x6^DkiZ$i8z>6E@*?$4YY4nKz diff --git a/osinaweb/osinacore/add/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/add/__pycache__/views.cpython-310.pyc index f41edb73f9c6cf400dde99c11f22bf8343f4dd26..d8a526bcca42aa23d4f0c3417bdd9b7652544457 100644 GIT binary patch delta 286 zcmV+(0pb4EfdS2d0S#{r4GI7N003%=;bsxB4VVia!T|sPbO34rpaP))paWz9p#gmX zd;n?$WCCjfa@UhU1t^p23-bjEWD<=8ljRIc0mhRt4IcrvlTi(m4Fqx#0001TSO5S3 zaxb&?4d(#?Xp`O#MFa-?3-sg;rS(C5xyRtDcvi;`a*sLJ1 zikb2F=F`H4OpL!a{}nA@WE9w(Cw_~OQERiO18|`G{&36C>wleGLyrMvcuCniClr%_sNkNN-lv&SYft0WyCw zCT;H2HD_cjntV|28e{Y38T!i^87FOaFf?OhT(Y^`+=GdcdGi6wSxk&#o1<+QnHUW= P$J)s=F}hB!bqD|eR#8UZ;}=z zh>$4aKNS@14K=hhIy6Pp&>D0-XZoGraQ?DCS+i)G8gtS-Xl?4Z=DQDXa>*6J#;KND zUsg4CxjmQDG7U&yBu-LOl?a z1iCl{5r3D4q^1@J$7*b83qL?nw{y1N8BQnnlQRwsLzSE~6E8cn_r_Z{-o>gbgsls8 zdrjtSQ|D6Ns4A9PgRO9-u*4Ndy^hL`YBdxxR@Xi(kL}_vXYp}XRcjKYqTkXv%Lgo! zSVpo8&URtDi$T#)&(I?h+A z34G8^Fe{@&-+d>*s5l1a$;VkWiBXW)y<;}3v`Qj?GorSw#TVUd30b-)z$ne-n*NmX6| diff --git a/osinaweb/osinacore/edit/views.py b/osinaweb/osinacore/edit/views.py index 6550a014..e4dd7c4b 100644 --- a/osinaweb/osinacore/edit/views.py +++ b/osinaweb/osinacore/edit/views.py @@ -118,8 +118,7 @@ def edit_staff(request, staff_id): staff.user.save() staff.mobile_number = request.POST.get('mobile_number') - - staff.active = active + new_image = request.FILES.get('image') if new_image: diff --git a/osinaweb/osinacore/migrations/0107_remove_staffprofile_active.py b/osinaweb/osinacore/migrations/0107_remove_staffprofile_active.py new file mode 100644 index 00000000..de99b117 --- /dev/null +++ b/osinaweb/osinacore/migrations/0107_remove_staffprofile_active.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.5 on 2024-09-11 12:16 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('osinacore', '0106_alter_projectfile_file'), + ] + + operations = [ + migrations.RemoveField( + model_name='staffprofile', + name='active', + ), + ] diff --git a/osinaweb/osinacore/migrations/__pycache__/0107_remove_staffprofile_active.cpython-310.pyc b/osinaweb/osinacore/migrations/__pycache__/0107_remove_staffprofile_active.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2682b9d412a5cac0a66588db0e7753e309b6977 GIT binary patch literal 594 zcmY*Xu}&N@5VgH~m%HVVk|qreO1BLQ6iE|BDNtzOkbpGTSY|zU^2NK}*n6O>6B;Bw zgkN%psQ3j6VC)5PjO5Y0@%VY(*k*k_BWSxq8RS^Xi zHC)6%&P6>lUGf6Xx**6e-ez3jAii-Mo8havc_(|TS=s~}>f>^uvjJgA`jqw#R-IhFy3S<6FOBa1Y0zdfPjp+ye8{)#7j@akq8EVg_2mk;8 literal 0 HcmV?d00001 diff --git a/osinaweb/osinacore/models.py b/osinaweb/osinacore/models.py index 8a288d62..16337aab 100644 --- a/osinaweb/osinacore/models.py +++ b/osinaweb/osinacore/models.py @@ -137,7 +137,6 @@ class StaffProfile(models.Model): image = models.ImageField(upload_to='uploaded_images', null=True, blank=True) mobile_number = models.CharField(max_length=50) intern = models.BooleanField(default=False) - active = models.BooleanField(default=True) staff_id = models.CharField(max_length=20, null=True, blank=True) # Allow null and blank for initial creation def __str__(self): return self.user.username @@ -168,6 +167,9 @@ class StaffProfile(models.Model): return f"last seen yesterday at {last_seen_time.strftime('%I:%M %p')}" else: return f"last seen on {last_seen_time.strftime('%b %d at %I:%M %p')}" + @property + def active(self): + return self.staffposition_set.filter(end_date__isnull=True).exists() diff --git a/osinaweb/static/js/osichat-admin/inner-conversation.js b/osinaweb/static/js/osichat-admin/inner-conversation.js index d4a76092..155a25dd 100644 --- a/osinaweb/static/js/osichat-admin/inner-conversation.js +++ b/osinaweb/static/js/osichat-admin/inner-conversation.js @@ -1,8 +1,7 @@ (function() { function handleChatRoomClick(event) { - const sessionId = event.currentTarget.getAttribute('data-session'); const chatId = event.currentTarget.getAttribute('data-roomid'); - if (sessionId && chatId && chatId !== currentChatId) { + if (chatId && chatId !== currentChatId) { showLoader(); openConversation(sessionId, chatId); currentChatId = chatId; @@ -69,12 +68,12 @@ } - function openConversation(sessionId, chatId) { + function openConversation(chatId) { if (osichatadminroomSocket) { osichatadminroomSocket.close(); } - osichatadminroomSocket = new WebSocket(`${admin_chat_ws_scheme}://${admin_chat_domain}/ws/osichat-admin/${sessionId}/${chatId}/`); + osichatadminroomSocket = new WebSocket(`${admin_chat_ws_scheme}://${admin_chat_domain}/ws/osichat-admin/${chatId}/`); osichatadminroomSocket.onopen = function () { hideLoader(); @@ -140,10 +139,10 @@ osichatadminroomSocket.onclose = function () { console.log('WebSocket connection closed'); - if (currentChatId === chatId) { + if (currentChatId === chatId) { //Attempt to reconnect only if same chat setTimeout(() => { console.log('Attempting to reconnect to WebSocket...'); - openConversation(sessionId, chatId); + openConversation(chatId); }, 2000); } };