From 9d56068da5b3d669f867b65a46fa7da19d8484f9 Mon Sep 17 00:00:00 2001
From: Abhisha Nirmalathas <a.nirmalathas1@student.unimelb.edu.au>
Date: Sun, 14 Apr 2019 20:21:10 +1000
Subject: [PATCH] basic playing functionalities with few logic errors

---
 http-server.c |  52 ++++++++++++++++++++++++++++++--------------------
 http-server.o | Bin 23736 -> 24752 bytes
 image_tagger  | Bin 43000 -> 43848 bytes
 user.c        |  42 +++++++++++++++++++++++++++++++++++++++-
 user.h        |  15 ++++++++++++---
 user.o        | Bin 9856 -> 11904 bytes
 6 files changed, 84 insertions(+), 25 deletions(-)

diff --git a/http-server.c b/http-server.c
index 63c567c..cc94a64 100644
--- a/http-server.c
+++ b/http-server.c
@@ -180,27 +180,34 @@ static bool handle_http_request(int sockfd, User_list* users)
             if(strncmp(req->body, "keyword=", 8)  == 0){
                 printf("strncmp with keywoprds is successful");
                 printf("the numer of users is %d\n", users->n_users);
-                // for(int i=0; i < users->n_users; i++){
-                //     printf("USER ID %d", users->users[i]->id);
-                //     if(users->users[i]->status == READY){
-                //         printf("is ready\n");
-                //     }
-                //     if(users->users[i]->status == WAIT){
-                //         printf("is wait\n");
-                //     }
-                //     if(users->users[i]->status == QUIT){
-                //         printf("is quit\n");
-                //     }
-                // }
-                if(players_ready(users)){
-                    post_request(buff,sockfd, "5_discarded.html");
+                for(int i=0; i < users->n_users; i++){
+                    printf("USER ID %d", users->users[i]->id);
+                    if(users->users[i]->status == READY){
+                        printf("is ready\n");
+                    }
+                    if(users->users[i]->status == WAIT){
+                        printf("is wait\n");
+                    }
+                    if(users->users[i]->status == QUIT){
+                        printf("is quit\n");
+                    }
+                }
+                if(player_won(users)){
+                    post_request(buff,sockfd, "6_endgame.html");
                 }
                 else if(should_player_quit(users)){
                     change_player_status(sockfd,users, QUIT);
                     post_request(buff,sockfd, "7_gameover.html");
                 }
+                else if(!players_ready(users)){
+                    post_request(buff,sockfd, "5_discarded.html");
+                }
                 else{
-                    add_keyword(sockfd, users, req->body);
+                    char* keyword = add_keyword(sockfd, users, req->body);
+                    if(has_match_ended(users, keyword)){
+                        change_player_status(sockfd, users, COMPLETE);
+                        post_request(buff,sockfd, "6_endgame.html");
+                    }
                     post_request(buff,sockfd, "4_accepted.html"); 
                 }
             }
@@ -234,7 +241,9 @@ static bool handle_http_request(int sockfd, User_list* users)
             // player_session(buff, sockfd, "1_welcome.html", resp_string);
             // free(resp_string);
             // free(resp); 
-           get_request(buff,sockfd, "1_welcome.html");
+            User* new_player = new_user(sockfd);
+            add_user(new_player, users);
+            get_request(buff,sockfd, "1_welcome.html");
         }
         else
             // never used, just for completeness
@@ -298,6 +307,7 @@ int main(int argc, char * argv[])
     FD_SET(sockfd, &masterfds);
     // record the maximum socket number
     int maxfd = sockfd;
+    User_list* users = initialise_player_list();
     while (1)
     {
         // monitor file descriptors
@@ -307,7 +317,6 @@ int main(int argc, char * argv[])
             perror("select");
             exit(EXIT_FAILURE);
         }
-        User_list* users = initialise_player_list();
         // loop all possible descriptor
         for (int i = 0; i <= maxfd; ++i){
             // determine if the current file descriptor is active
@@ -331,9 +340,10 @@ int main(int argc, char * argv[])
                         
                         // print out the IP and the socket number
                         char ip[INET_ADDRSTRLEN];
-                        User* new_player = new_user(sockfd);
-                        add_user(new_player, users);
-                        printf("THE NUMBER OF USERS IS %d\n", users->n_users);
+                        // User* new_player = new_user(sockfd);
+                        // add_user(new_player, users);
+                        //printf(" %d \n", users->n_users);
+                        // printf("THE NUMBER OF USERS IS %d\n", users->n_users);
                         printf(
                             "new connection from %s on socket %d\n",
                             // convert to human readable string
@@ -350,7 +360,7 @@ int main(int argc, char * argv[])
                 }
             }
         }
-        free(users);
     }
+    free(users);
     return 0;
 }
diff --git a/http-server.o b/http-server.o
index ce050eae728c5840758ba35cf9fd718b08cf3c24..3d4e54ea3933ba1e16e3ffec12faf81eedaec92c 100644
GIT binary patch
delta 8130
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

delta 7398
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

diff --git a/image_tagger b/image_tagger
index 058f8c6173d82bfd8264946dc1acfcf47c65e547..c5f4ddd9065e0c88e97564fe4817076b4524bea3 100644
GIT binary patch
delta 13271
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
K9FwEw%K-qussOP7

delta 11786
zcmX?cjp@gErU@EMKjux;TE_LpkpT?eI8MB^PjQAdn8Pr`+5yaf(Kd`=E`!bFos6eN
z4rN^ZkyiCwzG2yKj{vrXkF<Td)@+`^q{S<6z|?`k<M_b<Fm?Q~{^m>kUm49K%p4eY
znJ_Rg>|-!<VA#)N=D_em@X!DM9^I}#Jh~k?JX#NwO6~-!GKH&>G@JZSaI#<qNUsN6
zRKslYA|V%us5e|x&usE{p{IfkAhi*2QCqXgZ-uuTP5_B!A&ELLyfFFs|G!6b?E{8V
z$(>;NY`DC)+2*SvJWPfQK-&7@!nPnsfBy#7b^)XfEI$D*?`<|&Nc@uF29U1Ba8a<X
zFJHmBz?OmKm%!z{%{Gfla54!pm^(1+;sFUC0EN(Tv&s5W2@p{sxab+P$qS^k1qDEA
zCE%jB%_iTGGJ%Ln!$lvOO;(it#`Ml?vZPG5&;(FOr+65%sA@1UFqE*qV4plwri@Ww
zvVg2S<A=!xvU0o^--F}hg-7S{7e_Zo%SJIyKCPhSzXK%P*=q3{<b}N;3gq_{ASdvH
zEYmP|VAyYF?!fTk-Mjz)kGGoq{{Nqgfq}uJyH(@&|NpyKK#Hu)9T-67O23<IqbQ?f
z4^l4i?*ISSHZWzZAZ4CVWq03Bu2Phd_6I4u^%mqTuvz<}pz>+&CvQ}gSG)?6YCgc|
z!3dUy8nrJ5s!Hws<d2H-;!`22n4qfmgB<rF{?lZ2CDr<Pa|ebUpoIORAEXN6WVkh}
z-~IpZ(Rs+Dx77jU`_5}1FFbqm|36&h*#0WG3BFiNs04}OcA<+G+=c~zL3V*{Xoc7S
z5jnPhBHV^IAPJ}&VV;zDJDFcumnre{WIJUoE|}=nH<OE$J(w1oPu`;}$@Jj$WL<S}
zVF{4)Uws4xr|S<8+wApZMiptbPLQ#ku0K4QYkz>^*2BVqVV58%J`RB5_5vstj=rAk
zq@q%P6(qpKz`*cA<O9gPhd{~7qccDNOm{m7cyxz8*!LV70i2(pb{%(6_yiK`cKvbk
zaHvP;Q;+610{d-1=Dd9kGRO7Diz{#b|L+8w*LiW*4|4~GeIR*{&f}2y5e2EUMK(ae
zqqFwKeo%6Lu@WTN>H5K=x%LCd2MHh_sG|Dd>8r^~swzDC77h&i!9Fl~KRHNML(Iqm
znlvE+^T7k`*vS)AHJRSLn!H<8lBx0a<TGk|`U(sl-L5yf1w49PKkT!I=z_S-9b|oP
z=m(E(*B2g;RH6dbGdWRBl<EGf$!FB8q#Oi5LC*RG<Xw<AVJf>p((Y1DufSpT!lS$N
zM~a8B2`ry>y_l@4E+aSvlu$s0W#{o151#-3KVk9(4aLdT>f)RpmJSRr?mhqif0CxC
ziKzf6<AqM}=<YT64>GXT14MP6gNNhfm;e8FwnqH_|9^i5Nay6|lWjHS>?S|||KFqa
zK&8n3a**hk7yti*{q}M$0|UeUT98-(NJ)3A#sB~R_kpqu+{o=OCOc>-)~CFHncTb=
zWIjXv6)2-pZhsfZgr*n&|97{>{Qv*I^Z1L_=TIwNEAF3c3Co7|&ykcQfs}yi9gl8b
zP@wR@0_Eki|No&0sqxJPP+`-#ck%-bQ|=3V5dZJ2u$Zi%DavH<VzRlWilEgq6yME$
zJ~>BIktyRj$lY<G&k4EP7}-%~&tUErg8M}YB!<nQE1yp0)3W7R1oz*Br<23Aw3(Ej
zPHxfCmoegnIM<`QH2@S(j2Ap0aRYMyc`X^Hs%MkmYN?pCJV9~))2C1;yqv=bGN4rg
zBThCwo$RWuV1MBW$Zrn+|Nn2^3nCdR758rjMMe8lP&m6lqN3{w%sfLz28QldsBrO<
z$xF0fGVORYxnD;{@YN%T8w4RK#QVwQJvwsrw;v(JgaZcyL+9Qz-$6-y>w)k8|EG9#
zLn<7PPS+oX2Ryo4L89FZoyYd?fCtG5kiosZAHIWJ1k${Vk%NK3qw`$n@fUv{f!u%P
zJIMVYlA+$Lc`ukz$pi98J;RGtkN^LFE#BP<(%E@z{|mUeg^ysqN?`%{3Z%_r#<3Pw
zkWCC8y{#bHqqFq}$i3YVs`K~@@y{UVw?2S~LMR6XkIrNJIjmr*R1D<g?$!t2>p^+U
zL17mssH~B*f|Mkg5C8vfJy2@l(cKI7F4$?iKxGcZQ~sa+|L^Vvxfkk)T^d#n4B$Na
z;u)x-0htUom}3{XmbZW!EC4o`zqOi?fnmQJ$Tjt#jQFDSAxJgY$=wW?HiOhaY`*pp
z-R2Ou&APvk3~Bzs$lof>3{G6IAlStL@?;v+Ev*kgo~-9@{l>(=u)hH07?3?L{yhL2
z1NJy5o~OcPo*-mECE>ph|NplfC{aWWiS=;z-23(a|I3+7U?+e~1L>)O=&^-|Y&|Fx
zk%IR72Xqf2g0>H2peMvYh@S!!;0A%rfrOFaJ9Hxsz}@5xGJ*}si27~^j$OQ<aJc{t
zmxBACa49wNfJ7oFKKNU&fU*@zjNgNsx#P$G|1UQ~@-f6&4jla37;N<UTcc1#K_QTM
zAJhy3#f~jVvL0p&IKm!)N<xT;N4JB*K3fpK^Z1Kcu%-iy9-XZ(Ajuj`bspRQ8Xh~I
zU^RO|5)Aw;%8U#Q$6GIa|NkEpsjnlTITzGa@16=0_DH_uaqtmyy$9n3k8Xx;2M%j+
zDlgT*r4pjhqkAgI29HjGX0YjuQ03hW)?j}9bkyX42&T)RVCn^V2;xCdz?RC@qbmOl
z57pG~|Np;E^5|w&R#IT_=sdVf3KU78B6>fQwFAS8KllItf9<qG7i3`ag`FIh4h)bY
z1d<5e-h~u)iqL2T1-<mA|NkLnpZ$Gk$?{r5bOMr!UmySf-vP1%y%OJlck&Wr$NCsW
z1%`dH*5FbCT)V!|x(780rH12gVPIuoc=?TmfngUY{P%&(gfv<-?}G}&1^++=B8X(D
z6xnY8@=(FO|Nr-c)V;WN57Z2w@bCYB5Z9x3Du~(Ly5OJN|No9VK+SQF&WqqY12(tw
z_=~M~Kxwv8WWPDcBz3q+z4yRP-2?yr|KBG73aQTHFEsB>US%R%Z*>>sjwAoTnY{r-
zH6IZ0=mt0P`R@Jy&%gaZ=kXUUcmDrR>ufy)lJD&WnFDgi|Npxnrh!WM#=B6voj`U^
zz6<lk&%2=N0OZAepsqpZ@fYfMp<%UCfMK$msTl8)e;_xk_y<-v+1Emralzzl3z^A_
zO@-J&8arEOOg?LR-+tO{s1@!YD>&}JtjN0qHSonoP}8Qfb;CbU$j$i&N%b!UnLyRX
zoXNM$q!{ObOiok$;L&=3zvU<>JGX+=S+{~L;%~J8=a(t}{{IL2tamDi>CxMJ0pd82
z|H1WH|80<y*MOrBL^4$J@Am__%I)_5|1WdF=B@#IWevzekXK?s>a1I5{QLjEj;Fg7
z#Onm}AVJxA{Kc)O;2LWO$d>M@AWwL7w}N?)wrIo)a4dl&z*TRkHLM;hzB&1(xpH9N
z4Uho`p@tvw=sdT-0ItUH=Kue%t34nFcY}TH(Rr=&_zV7T|Nl3CU~D;15(^RTJpRJu
zCMYuIfPDZ8GQ&hrC^16hA)esxy9?^-bb~`1l&|hw|NsBx#y|i6zX-YkYD_qWJBB%S
z{&x&@4DsnzT_>Ty5bDvZ3!;NPJHL5$UiHxg^&dDq4*q3+5q^F0dy8161vfVPSw3Q7
zs<4=BWMjs3!eVlkjU5w*<>pm3rHqq<?3PJ|c(^L~h59<V1}XTvDTD^Q1_dj41}mth
za83Shr&|vi-cVy;V92=m|9=M~1B1ks|NkQx85sDk{{O#$k%6K5>i_>27#SFLT>Jn3
z10w^&^=tqC3otP-7~J^(--3yO;n<D;|09?f7(U$i|G$EXfg%3Z|Nk?X7#Ngq|Np;(
ziGji7&j0^6m>3uY?*9M(gNcD5_1^#g63h$?qWAy*w_s+dXP9>X|NjVP1_td1|NmDo
zGcYhe{QrLjGXsPD!~g$xFf%Y5d-(tV4Q2)g;Ya`f|6pcdNPP7FzXS^d!@5WR|68yy
zFo-_>|389-fkErp|Nj*%3=E;q{{NrB!octo)HG#bV6c4t|NjjZ28QR)|NsBN!obk*
z^8bGcRtAREFaQ6yU^Qo8P<;LWe*`N7L*kqN|0`G-81&!&|38D3fx-LB|NlE!85nl_
z{Qv(3D+7bZumArQ*cccre*OP%F}cz~ooUCV$%`EHm~Nb(e91wLDeUs(Uk-9ii!V=>
za+G5_aAmTUqa4%zE0d!f)#^W7{r`U&s6=z*6KG>{=4E4=$ivRTz#zlG!0?8Ffg$bM
z|NmOZ@~L2HusjbV14F^J|Nrwrr5a2>a~2~=1xUXRs8MwN|NkS%`kD5Fq`~@q7#Zpr
zl5hO~FNk6Q58QwpMh1qEoB#jcK{4Pu+<+cN1_ps!|Nn=g=nsJFU&F}2;ClQ2{|zYm
zSHtz6VXS9hxO)5l|3(xAHE;!Q7#SGM?)?8h6-9mmT%L!CfnhZ$9ihlyhRf?PF)$?G
z{r?}-Z)SjnP&rr{5(2JF3=H*m|Nn1CF`x;o0u+QfObiUq?*9Mpiz4p<m+xU>U=Y4H
znaf4WZ4DCxgX2BiO3yGcFy!6)|34kYs3f>iZ<rVuw%(hp<s!w#!_2_2>fvNB7b!L!
zW(J0>4<~22NU`}aGcZ^_n%w0g#g@a&z!3Rp@+uc8wjO2%hUbqapK_66Tf@x2knjYo
z?F=&mL-v!&T&_}VZ<rYv4nCc%<toL-!@|Ju@Y!T9S1DH=76yj?m;e9EfT|K$$S{ku
zf}8{LxDTj<@b3TrTom~Xu)GTc149lA1H+BUD_xxxw}9%;FaQ68TJs>Ufv^Yz1H%~>
z28JJ>|Nj@*Ea>*1eY1j_3Cm;wKL@4<rkjKO<}ovEV3~Z8QEajTGYcOR!!#}i22f*~
zfnlxOWT_w(;T9g4z*|Mguxr?4#UNRcS^O|@XH|$euK?Jb89|E~r%$#Cp3OLY@{QnR
zsqf4T42;@23=9lR6C?PRGcYiKnw*@>5oVJ^L$VmBPd*T$%9LR?`FThRQ-j%L-_XSn
zEg29k9$+n-nHd;3nJ1V{<_i17w7_igzpy^04Q7-3!pj&9CbLGwGaX}@oE9O^wE+|c
z3=9nS87D7H2(D-1V13TOz`(}h1hSqPG_=XS2NXW+o0u3F7}>WoF)%POa5RG`_ErW4
z2F^!J3=A4fT+ECN3|!633=B-%AZIXeXQnVP@q{xlFmP~HfmHK?R0wc6f!KT?aS1L#
zkaB*I9Wq?8AaQ|ukc0vQ3kS#y4v^7Ig6l!HfQn@SCSgmEExsV7A|RCvT)7~&C`g!t
zfrZ1Kk%57QgOibgfdiz0Nlb*1fq~~Z$mLuhxxbQ-fCuMl1_lPkISUvW7<e;N7#O)g
z<}uYzjNy9?QqB!h&NMND9~AtcI)jrLG^h(oAq)bQ3=9k)F~L-j_ZV0~h6r_mw2A#-
zWMEh;1+fKOG=OaZiSmJ*$|w$E!p!Ak0>u$%02pj83x}&1s8|9S50U~KFUG+7k8yH!
zlyp7F+ah4c$wM6{atmaqJSeP~CMGZlUjuP94@*O=zX3KB<jK2CP)}-tJjpz9PrV4(
zF`6L9Fi+f2FLD8_6J!wc#1-|T#SDyEZ$TkDF@f(8NJ=}0VX|bjc|AxF>?}qGR*<RU
z&q1>0vt=Mwf(t9Kk3pFq;#hN-W5HIMgRBHQHUp&7<~md-xD*5HEMsP1fH=<vqBcV8
zF;r0uxQEQZz#y8*z-SBd3)93L1_p_RAfsH5Ff%a3$wC|gF7&|0fkYw3xx$P~gDSFv
z1`x<JH@Im`j7(=iZH5mZL;XP7S3}kNF+lBSoFmBsbEF^4)Xh*;_DH7s!%dY~0x~WP
zWZX}vLWCRB;iiSbOk<RTcm&yv;o%_r!CsbR29*(UZctU=f*I^xkx-C5aS(fBARdo{
z7#bh~%5RKup!~)(F+wZ^syPhF!SN7{poH)Wl$RK;FflN2FtUQOQ3f-EI0I->V=Yvp
z12aVDM<!6wF_|r1t9~lTSzHOAe9geN3e@u909An8uFMP!8q8cAAam3~!rWUxdU;EW
zau}F-K-O{a$b-arL2LmYP-}{r52RdzCmJNq4-y9z44^WH4P+d%z<ve>20mYqjl45K
z*-p+u6l5raDAZkyb3nrUvnC&jSJwc|ae!on^gtQ}K>lQ&xTH)7l-w8<w=gm=Fi+f2
zCe$%mIKi630;I<LkmBU91T|GI7I+YxU}gY^0K8y_+O(Q^^1_5(i0^qIzUP4WeklV3
z124$A8q8c0pe889_uzI7Ka%hHkbKVv@jXbn1RtvJL4nBuGLBi`Jji4h76t|l7M3EA
z$-coX3=Ax+AfGXSjbmX01sVs~I2Lx0aRPj@AT{996=F0CCrFI~0|&??7A{Rt`LiG7
zd;U9&3=D4-CnbrR*@F3x7{T?Cpb85E10y&(m?j1Yfm*SQ0wA?a6ElQCg(WDlaWZ>Y
zO!iLF<N;ONjM5-0CMr#CND`I)05VGkB)~K=gF)afh^q|Jeo<-ih9pq~uwBYfyC9~k
zfTWowCV)+!11>T_Qv%?~)Svt{NxA+n$P@#Rq4mm;Yy*mTkOIaz;1X*aSOLTw4<Qqf
z4-7%dnI=XEMS^%npfVR!EQxLeDRq{B*3jA@L%<nJ5bRTDh#46S3{$xo7+4sLSs55O
zR3Q0dAuA+tAZmAr=28|01}4+VyOW*jPq8sDFxOass@5;;3=GV*pfZ4|48*JhGo@J>
z7?|t93NC|~jbKqh5VHv^x|oB3fw?&oWP$`I0|Rplh{?>sJ`W_)4U+5ziLi1o8G!7X
z3F0ul0*TMd1QlOQw?V?|!NLnb_HG0j%f`V6$^eXPpk^~u1W5T_kj?Bm91ILMSU%1L
zl>(nZN#|1%$Wt8dYzz!6-$D74gJTmr0|Uzs5L<xb4l4r#%TEwnf};zh<`;;qz>&hi
zz`*jm9>me$xCk=n4~T8Rq0Py_!15Qww&0im68{HcJ8<p+X=Y#qaXdH+L8dZ-IRTtj
zAPy6l6T!&=;;=AYWny4R;QR`*gpKhw69YpAXE#WOgAwH10!|i?Ej*0%AYKWl0!SSn
z<0b|Mh6+v|kdzRk8v_GF17{G(E5eK+3=9lSoJk<(h%i26Vqj?Ilmh9IVEo9$z|g^|
z0^%q#?qy(Ln83*g(xb_Ei-Cb*2B#>9qXp(H;FJMzw85MeoXYGB46!UaVBQ8!Es&HR
zBWT2G2d5Couliu89^h00xyO+4I}-!L5e6<$Ta{%RyA2xyg9OVQkT*HFK&t10m<$}Q
zAcxEYd6<JkdvaJ>Kz$uM0|Toe$Tv*)Sr`~tjX}}K6ve^7z@{h)DkXk_d<7EZlW1jT
zVBnv^4$96m*%%m@_)S3(&u;;80e=w(0|P66EE@v@8-F?*0|S=;D+f6083eC_7#s{t
z$5|N|*kwR=v7caJU=U!NxwW2|fq`Qa$hO%a(-}BcvM?~P&DjdB5V%2!>?o)RJpn4a
z7?=z|xkpZgnSp`*Kgd@c@-IR9w}ONfK?)fdm>NNxa!HVy7wilS0vzuRLFI88Ncbbf
zj!SF|3>=?8TABDb{((53FEE1|f-@#>N>>uu$HKtCX$DI1LJgb_pt_c0&*T^BGWFlt
z7#KLcgIE|C*eA0xFihamO9z>{nuCFX%b)=4*<z5-O(%kyc^v8>wk@cL6W|a4vF+wC
zFfd4P%mJx)sAgbbkl}d6%D}+o*v7!XpuoY-&cMLs3`%k;9DhJ+TtQ}Pa7+QQy*4qV
zGB6l$ykKEq;PM0YQY|=wL7D?V&2I;e5Re5)pfcWrV<SjS@?Qo9h5(LOkeU>bcm&6K
zkeXDGcml^CkY#Bg@eGc35IY?tUcg~E`9+2uq+;TSR7^~uiiwA#9Ta(>nnZ(#>let|
zpo)oydl{(HBnGOOcz8gWkAnkLG4b$%*a94&iiw90q+EgnR59`JgTxgW*f`2r85o#A
z#_<SjWMyCwVF4vEUS=&e1_u5;lb2=+)H5)FIt{$++-wXC?4Xvt1}|49D6&AE23~HE
zK@4J<DGa<kpdjPm0CgI8c^yFsiv!eY;N=5}OK^Z1F}(aBgJn2Cod#Y3khlT^6Ua<n
zK~s?NpvJ!dukcQg@t|fiuSgQ8>BPVRYJ>8Mg2frwIQD~5HwVZOOduV+VpG@{7{n#m
z7#J8;BiI=jU?q7OXpjJ03xGr=VnH>AD#*di6L-`}?B@Wf2RVXy;+8szV_+^sc14{8
zxav{mV4S=&ODVz*BxeFqdZvzn8Pe1gcV}f_U~~bQy;BWRe>uQyyur@E0I|^pVkXQ+
z7l<)n8z&oQYt(}c4}gfCsbdiL23eK>GWDlA#ME=3jvUw@D>-1MCO}M`0rf`$ME?}1
zKcKQ5by7D$<wOcZ@s2vFlOS#?MDdzBsW~hRlW%29$xa8^nG4Em%o9)4N#-#y=0VhK
zsFSjrESRHR{|)5VNg!7p*MhhT+>ZylDw&gk0TP^(AiDPCOMqgGaS}*|dE$nADR9_N
z%LG+@6CdP*ESL^adL&;8+*4TsapH-5$)eOk2FB%8V5JxGWxVx3*3~mG+y>=r1_lNx
zP{L!p2~mF|UuG&;0RuxRR9-TZf$<K+@B{gvJ~78pHU<W8AqFy37F38aa4@iOFo06c
z1(47Gfs{Yi2U*0x03Lq;`-_X4fkEOU$m9RORS@&UKQ$7Cpb-2AO5e;AKh(&9QxQA3
z5@4P<p;qn@NSdD!q?LJML#<pR$b50eFQCTo#0|A_Z$YV4gRz_i)Ns8}E4LnGybe@<
zN3DFNA;cA+B^4kKxpFZu$n9sZXJBB|gsPfSD|ZBB3yeRbmO<thRGSyHWh<u)GS>iR
zPn{e%KFk;)5wf6GhS?Zmj}bI&DP%G*T0kx6sg=ouN`uDKLC&a`69Rd}9_o<;wQ`R^
zd<RB-u*X_z<@SL1j!+Zk)XJ=fn(zsv9aOMp7BDdSGV*hSnxg@7OF-e^#|X;G%oA7C
zf)(+Cq5&LH^4tszJfMi;XOOA_smziw;RbcO4_H8)&CAZrz#s(*MMimu%nzuHloKdy
z6hINc$;@C0Q7+X0%KM5Cl@>6;M371)h)M^jpkn9d#{5f6lVyuIH^&v7VK!x8kX2;x
z6xL^DV30FmVCJ*pwr2GdW|ClFkmqI;WE5g&6lP#hFkxWkK*%U=?kfAh$jCRjx?&C!
zN5*8S$~-0}=E)x`LzvdeO?Iz3%k)-pvRHKzqw?m;>TE_PXVuBiYOV`1^Kwk!(C7HV
zq0h0F<13Sr@Z|5c76!~&9BY`R^qA8)PB6>rF)4{WozEO!!mO<Dl!1wbDU$68TRBI`
z(@9Lq!psjDBA6FXPOejO+Q+nqQJ6_XWc~sUk!MV<q8!TenN)-)zF_hdxxSCXmZO<t
zN+B~RlPx31sgodMn4_5j7#WyY7}-kLm^C>Ro<?mxRCkq0u&^|>sFEQuB_%#PwX!_F
zC}r}+My1J&O`@CSn_Sr@KVW3toYE1(==H!9642mygc8gQ0t_FpiVHHpRy0DDf+=PO
zA%+_^o0+=8nCd~R5J7@`AcBE`;S?xCG6*n$)**s~K&#$B^kb+vXw4yr51RP_(SM-g
zpjCw+K1@BREyc(nzyMk{h%Bzh$iM&+2Q3U_U|^Vhy+>0DHgE)5R{&C*4pk#yK3S?)
zk7<SZWUpR5DGzA6gQ)^dP=HKIu$VllSFawHU_os!kRj}#em;W$11!11#6j~IAZ@S|
z3mx8LP=Kn3C0dwzO{h35-NMvcf`)$>_!yw2G&6$?>*T0zxycEA98519CujBbG0m`^
z{Hsro>452Et$sJA3#OBc`j<(e4@p!rGcX7-@G<OEn`|_}P4faY9%11N>TZFgVLfWl
z-~`BfHzzNgU=A8^y*0rPoUXMd#WDR<pWHP`k8$?oos-;|CMr#4n(W4OQE9T*WH+V{
zrjsX4)?<vDd~mYAAZ+C8C@aM7pOY1*hzo*Nv4V^S4cdWdiOGpm#3gmuAZpNu22CeV
zoZ>F&36)(Y07;g)AdL(R3_+7WP7!B}1DU{B0wU`{tq1`IDTb231gIJaH5F<CVh{-;
zz5*(a-ecVk6-Tc{Kpi4bK;;WTToMUwA)E%QXPBHmMbPjrn9YYV0Qm(fj^3+fn!Ip=
zIHL%d)Buw<VA6kb;WTl{WOhi%#EC#`)PgviArquVvKA@}8w`RCx^#nN8Rvq@jbQQ^
zn7jcZP2aFHFbFb9GE|_2(hsO<9Z<W#^Fj;^450ZWg~=Bgg#{HkAg(zC9aGnyd~v!w
zqu%6?)5Rr0OO-%jgFcw(Jy~&vIAc6W&E|j^DU3`8rjuq$Fj{UtKXWF_<g$5pHYd#2
zW#maKN==O~N-Zo+EiT!-Wx-{}%^iypn3)XJCcj#$#|0~q9+*y6T4p8)D~LXTmNqjm
zFf5&%xlCUWRt&)wT-!`uxlCX1h7Ba-ZrDJAPGs}TW&4?!jHM^9T4~008k(3MvrT@r
z(u`|e2}IEx_Q_hS%s9PjAY8}EnXAm1R?nThXq6q;1kmUg0|Ubf{>iUanQ>WwhJzRw
M7>YS2uUaGr05E#lu>b%7

diff --git a/user.c b/user.c
index 89a7963..eb24348 100644
--- a/user.c
+++ b/user.c
@@ -38,7 +38,7 @@ void resize_keywords(User* user, char* keyword){
 }
 
 
-void add_keyword(int id, User_list* users, char* query){
+char* add_keyword(int id, User_list* users, char* query){
     const char s[2] = "&";
     char * curr = query;
     char * token;
@@ -50,6 +50,7 @@ void add_keyword(int id, User_list* users, char* query){
             resize_keywords(users->users[i], token);
         }
     }
+    return token;
 }
 
 void add_user(User* user, User_list* users){
@@ -97,4 +98,43 @@ void change_player_status(int user_id, User_list* users, STATUS status){
             users->users[i]->status = status;
         }
     }
+}
+
+bool keyword_match(User* user, char* keyword){
+    for(int i=0; user->n_keywords;i++){
+        if(strcmp(keyword, user->keywords[i]) == 0){
+            return true;
+        }
+    }
+    return false;
+}
+
+void reset_players(User_list *users){
+    for(int i=0; i< users->n_users;i++){
+        users->users[i]->n_keywords = 0;
+        users->users[i]->n_capacity = 5;
+        free(users->users[i]->keywords);
+        users->users[i]->keywords = malloc(sizeof(char*)*users->users[i]->n_capacity);
+    }
+}
+
+bool has_match_ended(User_list* users, char* keyword){
+    for(int i=0; i< users->n_users;i++){
+        if(users->users[i]->status == READY){
+            if(keyword_match(users->users[i], keyword)){
+                reset_players(users);
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+bool player_won(User_list *users){
+    for(int i=0; i < users->n_users; i++){
+        if (users->users[i]->status == COMPLETE){
+            return true;
+        }
+    }
+    return false;
 }
\ No newline at end of file
diff --git a/user.h b/user.h
index 81ce36f..938e19e 100644
--- a/user.h
+++ b/user.h
@@ -3,7 +3,8 @@ typedef enum
 {
     READY,
     WAIT,
-    QUIT
+    QUIT,
+    COMPLETE
 } STATUS;
 
 
@@ -27,7 +28,7 @@ User_list* initialise_player_list();
 
 void resize_keywords(User* user, char* keyword);
 
-void add_keyword(int id, User_list* users, char* query);
+char* add_keyword(int id, User_list* users, char* query);
 
 void add_user(User* user, User_list* users);
 
@@ -39,4 +40,12 @@ bool should_player_quit(User_list* users);
 
 bool players_ready(User_list* users);
 
-void change_player_status(int user_id, User_list* users, STATUS status);
\ No newline at end of file
+void change_player_status(int user_id, User_list* users, STATUS status);
+
+bool keyword_match(User* user, char* keyword);
+
+void reset_players(User_list *users);
+
+bool has_match_ended(User_list* users, char* keyword);
+
+bool player_won(User_list *users);
\ No newline at end of file
diff --git a/user.o b/user.o
index 4561529bef21b14459e05815a19a720799bf6d0f..35ee1ecfde6262849be0e31584002bda610d4000 100644
GIT binary patch
delta 4411
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
PKvg~i1B27#L}hsZT_2_j

delta 2503
zcmZpOZSb9-$*8zdYc3P#1dndlA1NNjESoPgDKJeIU{7Z{#xl8*U7l$J%j8+?S@la8
z7#P?YKmbfKf=MO@4v+{Fdn*G211E^7!NkSP$iTn_Vl#2)fGF<F6b2@qa0Uhj4u~)>
zNQD4|%?A>ffUx;NcE~{30w8e(1{MyG5gZH*^$ZM5g6m<n2rvm-!fg=&DTUf73KHgE
zVBxT5WME+7;ACWgx=>7nk%55+<QzsWkQ|5w!W%#Y0|Nu&oCS;w47`~s42)bL^Oz>a
z@PVWlxk0L#Ce~;0gSZ<Q85lU3K`by9sAOPZ0Er2vg1pDT3Nl0pB*iH9gAqhSa3h3b
zV4MRIg%~UjVlqvHn9Ik6VlE4ZD<cB~*mRJLU@9o+#TZ!sF;4E|ln(J_Vqg#f8ObOQ
zaa{(K2MR2vi3tqCU`b673Bor(1lW^znV_E31bLEq;+}elPR$>a8M&kx-%gh0a;tyK
z#J~Xd5F-OCNP{>?JEJ*>1YsKx0X9vC8Riai6nB_IyasazOantZTxS_vrwv4Hgcwwg
zAx0L;63t{_v;{enX<`log9J#F(e=pW|6HOxN8s9Be@s^3mQHtrt7Bqh0;z;3_X8;e
zaY5J*M1b8b$pUk?AG+=KP(>ii{o#f}Obdfpo(|U?2DaQi9Ij3hq?<7gM1pWShydFN
z3FSD5!WbwIVs`+Pw`8&=k2GWa=83#LjFaX0RX`cfQB#bOZ*mO(943y8$-nvYn3$M1
zUlNdJn*3Ktf;%xKB|bZ~vOK>iWwNEP(&S8GxyciREhZlk?%)T<xFerH8<R6H8`I^<
z(IQ7DFA<g4d_a_giSfqdlj7lw^Cl}wh%?@rY$>5HnFvkNzEB6>VPIeoVqj!gH@Q(l
zT=5T@?0cxJCksS*`eZ{%RVD+|$@Y@sOa_*d3nfo)u91pilAHmK3I+xc1qzx!{~>^X
z@<$nQMtv~p2PUIH<m3~w3mD}#XUeHF)-Qz^4bIk}Z2KR|hvipLDFG6<0h!Ifz_14@
z4-;2|=Dy2l;;~Tm_tC_`X`F$9;Wb2jvbutx;dcld?uOGaKGbZOT`)I@PTr^>&Zs!K
zQ9+zhcXFYkIHMa#L^2RfJwMb9(UTu4h)dR^$zFx>dnXGjic3z1@<0?T0|SEt)D7Dv
zJ1UAx9smi05*Py{kYS;79c=qkkO_?MCofbKmlT2833Ky9s5w%TFDi;l8luU<++aVM
zQAu3V4^7qp$`6@rs3h)L3FW~|J_vPF2b#D9l)o5C!_>1t`5PxsR1){x59NUj0Wmc|
z1Oo%ZXDAKR<p|~fgwine^Pqfz$sd)(8RaGiDud!eQCVEl7@CS<DsMqmdV$nPMxe<)
zgUXgqZd4YRY($fV<(C;?z01&KGok$BlOHOJ8=iskU@rH9ntTl^4s*{sDE}?UOwZp?
z9!z!{lrII%b1>76gA_0@FsMMqL0pgpusmx$nNd|d5tdV7vMf;58BiK#S{g_z0|P@I
zR2-%rroRy?4pTn`nu_{CwrI^olYI-)&cML18Y&Lrf-DGUnfys@ALG2q8`Z@nVbSma
zY7|HT2q#W{s4gxE3ls&AUT7i*$^Mxvs3Fee$+EdiLyVDk1JnYr5t9#U2~R$tDZ!;6
z3g$ChV4D0$(~Ri@%VbAQvB?Hn8Zc%7ggHygPBa{pw-^{0PNADLNn3*J1GI3+V4tj{
zZN{kx@;w6sL*L{?ZF8pe+>>W%+c8DRPrjvX$9bO{VyDn#MICdd4*AJZI(D2NK?M~9
z14H%Xg*xU;IsB7v>DVzX<cBy%SA%l}xM{(_5HUGX*PLsCJj93(43ih>nlma)zNKr&
a$sh<3l$fljXU-`Bt}+-HSSBZG%L4%GqdvU=

-- 
GitLab