From 4f77bd8eb7fbe693a3e06f7e5cf7d7b38fdf7579 Mon Sep 17 00:00:00 2001 From: Steven Schronk Date: Sun, 19 Aug 2012 22:35:09 -0500 Subject: [PATCH] Added instant message feature. All users may message each other with an Ajax enabled message tool. --- TODO.TXT | 28 ++++++- ajax.js | 58 ++++++++++++++- auth.php | 7 +- code_db.sql | 9 +++ gfx/bullet_green.png | Bin 0 -> 740 bytes gfx/bullet_red.png | Bin 0 -> 779 bytes gfx/bullet_yellow.png | Bin 0 -> 750 bytes header.php | 46 +++++------- im.php | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++ im_chat_update.php | 20 +++++ im_send_message.php | 8 ++ im_user_update.php | 17 +++++ manage.php | 20 ++++- sfx/beep.wav | Bin 0 -> 10362 bytes sfx/click.wav | Bin 0 -> 6394 bytes sfx/doorknock.wav | Bin 0 -> 8492 bytes style.css | 47 ++++++++---- 17 files changed, 408 insertions(+), 49 deletions(-) create mode 100644 gfx/bullet_green.png create mode 100644 gfx/bullet_red.png create mode 100644 gfx/bullet_yellow.png create mode 100644 im.php create mode 100644 im_chat_update.php create mode 100644 im_send_message.php create mode 100644 im_user_update.php create mode 100644 sfx/beep.wav create mode 100644 sfx/click.wav create mode 100644 sfx/doorknock.wav diff --git a/TODO.TXT b/TODO.TXT index e67e2f4..b372c0a 100644 --- a/TODO.TXT +++ b/TODO.TXT @@ -1,8 +1,32 @@ -cannot use "enter" key for login credentials form -cannot recover password for students +Cannot use "enter" key for login credentials form + +Users cannot recover password for themselves. Email for created or modified assignments + Email for late assignments + Email (to instructor) for comment from student +Create management console that can look at all users's messages + + Should include search to view only a particular user's chats. + +Allow users to see past chats anytime - everything is recorded + +Create private chat rooms between two people and a public room as well. + +Add sound for user entering chat and another for a user logging off. + +Create a message board for each assignment in system. + +Empty chat updates should not send any return at all - to reduce bandwidth. + +Noises made in chat are not what is needed. Need a knock sound and a send and receive sound. + +Users in chat should have different color chats to make the messages more readable. + +Need a place for students and faculty to share code outside of assignments. + +Need logoff button instead of name to click on. diff --git a/ajax.js b/ajax.js index 2c48161..cab229a 100644 --- a/ajax.js +++ b/ajax.js @@ -28,8 +28,6 @@ with this program; if not, write to the Free Software Foundation, Inc., // if waitMessage not sent, content will not "blink" // callBack = javascript function name to run after data has been returned from server function getPage( url, pageElement, waitMessage, callBack ) { - - // START TIMER var timer = new Date(); var t_start = timer.getTime(); //debugEvent(url, "get"); @@ -96,3 +94,59 @@ function getPage( url, pageElement, waitMessage, callBack ) { } if (callBack != null ) { eval(callBack+'()'); } } + +function sendData(url){ + // START TIMER + var timer = new Date(); + var t_start = timer.getTime(); +// WE USE A JAVASCRIPT FEATURE HERE CALLED "INNER FUNCTIONS" +// USING THESE MEANS THE LOCAL VARIABLES RETAIN THEIR VALUES AFTER THE OUTER FUNCTION +// HAS RETURNED. THIS IS USEFUL FOR THREAD SAFETY, SO +// REASSIGNING THE ONREADYSTATECHANGE FUNCTION DOESN'T STOMP OVER EARLIER REQUESTS. + function ajaxBindCallback(){ + if(ajaxRequest.readyState == 0) { window.status = "Waiting..."; } + if(ajaxRequest.readyState == 1) { window.status = "Loading Page..."; } + if(ajaxRequest.readyState == 2) { window.status = "Data Received...";} + if(ajaxRequest.readyState == 3) { window.status = "Interactive..."; } + if(ajaxRequest.readyState == 4) { + window.status = "Transaction Complete..."; + + // STOP TIMER AND FIND DIFFERENCE + // MUST CREATE NEW TIMER INSTANCE :) + var timer2 = new Date(); + var t_end = timer2.getTime(); + var t_diff = t_end - t_start; + + // TEST HTTP STATUS CODE - DISPLAY IN DUBUGGER AND STATUS + switch (ajaxRequest.status.toString()) { + case "200" : + debugEvent(url, "got", ajaxRequest.responseText, t_diff); + break; + case "403" : + debugEvent(url, "error_403", ajaxRequest.responseText, t_diff); + break; + case "404" : + debugEvent(url, "error_404", ajaxRequest.responseText, t_diff); + break; + case "500" : + debugEvent(url, "error_500", ajaxRequest.responseText, t_diff); + break; + } + } + } + var ajaxRequest = null; + // BIND OUR CALLBACK THEN HIT THE SERVER... + if (window.XMLHttpRequest) { + ajaxRequest = new XMLHttpRequest(); + ajaxRequest.onreadystatechange = ajaxBindCallback; + ajaxRequest.open("GET", url, true); + ajaxRequest.send(null); + } else if (window.ActiveXObject) { + ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); + if (ajaxRequest) { + ajaxRequest.onreadystatechange = ajaxBindCallback; + ajaxRequest.open("GET", url, true); + ajaxRequest.send(); + } + } +} diff --git a/auth.php b/auth.php index 7ee9c03..8c9d9c7 100644 --- a/auth.php +++ b/auth.php @@ -1,5 +1,5 @@ |LWDv^?zWNH2`eXDB|tvajXrdlcVVUGC>7sRf@8{2)(#saG1+Eoa=;u^!O8u%zs0FWYj32(&h3fE7y>p zImUC$VJ_!zuI2WYVnp;+N!Z=ghMwvW&Nl1=YHMi4<}Lr71L8Bl$4~V7V|X@v8|@VS zO89AIM5S6WtrLF2uD#7TN^PK3t-`_O9VSY45g(`>^nD)0ONvYq5>8q1ax)@u_X!Y! z1fLm$Stv=EC2)gSa=IC<_8E`qa4L%1LDt;!+`nqan;sk0Q0yeT{|Q|I|Am0R0t^5@ WHtv?%@o{R6aDK`KQoh!;;D4D?b&A{8{3fLaKtB{a1f zj4{UaS7>(goY`z^qO>W^Nbx2P8Uh*u>MlU8MqrFp zJU;jP{4E?NBq7dk4>98CjD^;UFn&244Wp@Iy6rXWShY!5CP11!g*r8IVU z!R{XdrT;k0Kb(Z@*VOdz+vtsL5w!|n)2I5*9XrwyI(hRpW45ngGS*ZlsaE~~|wQ)X3zBS(hTq-4ye~N>w z+Cfm-D{n@5y92}05Z6q)YJ~s>jDyJjFit6U3;w&Q3@-T?z7_~DPF%zvm27q>R%u#p za)B|+CZWh_dL+A%#}e2;#(GP;fcA((T=MyIARSb|)@&+!FOf_E$NEwLNm2f4LbA~w zafnMkn3Te8{(Ib@wxf@WYAdd3^fl zM8C^9(%0J!Znqmd$ZR1^gLFC#i%ZK8%dF0fMi$1=nn0{p8$|mZ#S-EWqVsCE=WM|1 z8f%xO6JqC@0DRZ<_rYXl>dA8IH9meu{IqHm@4So<%?K9)j}I-T4a`7mh%_RDShxCR z1Z9U+%n7HK-E(0!9M!z=uU^LoUVFumYjJM;Cu|7#F9iG&U;vZq6mJi1`DFkA002ov JPDHLkV1j$QW{&^> literal 0 HcwPel00001 diff --git a/gfx/bullet_yellow.png b/gfx/bullet_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..604e614403122913a580f6f50c8acbe5f5a0e4bc GIT binary patch literal 750 zcwPbS0ulX*P)$)CFH(y=bm@x-t!`KT}M0D8nk(J2y_T^2(+Dm(g+}gsQEef zAaua1Vc4$d$FU@0#1uE|9acsQ=B=0lvM{d}vTByt{%;nq!_|E_{*D;+)9SaX6 zCS-oSr6#lo1IkrwJjGK#1&Z_Zbg?FGnzLeV=`;2W46)n$Y}brfE2hAuxo`*$mU;1m zOlWh^>?_P6_Y4fNZYN_H+wv4}sjN5fon=>;L>Qb!9Vkn!mnBwWR4WJw^Ha`B0(FyD zkub0lC#)bKpHs@P%+8e~ULV^ychfzf&u7Y$DDt7I(QvG)Vy|PW#1L!7G-lfrfght! zGB=T%AzG2I!KVJ9301jgV2Cwi7~8P6P3VBpNd7l>ciswZ^G4u5VoI+$_ccHpOleL| zApR~rw(IQM3-l%p5-kf6zq)Cgr|$%Z_Xa&D(X)qA9N=jyOLogout'; - - $menu = ''; - +
  • Manage Accounts
  • +
  • Search
  • + '; } else { - //$menu = 'Classes | Manage Account | '.$_COOKIE["username"].' | Logout'; - $menu = ''; - +
  • Manage Account
  • +
  • Search
  • + '; } } else { $menu = ''; @@ -54,14 +53,7 @@ if($user_id != '') { -
    - - -
    - -
    - +
    +

    diff --git a/im.php b/im.php new file mode 100644 index 0000000..0bd7dcd --- /dev/null +++ b/im.php @@ -0,0 +1,197 @@ + + + + + + + + + + + +
    +
    +
    + + + + + +
    +
    + + diff --git a/im_chat_update.php b/im_chat_update.php new file mode 100644 index 0000000..389cb12 --- /dev/null +++ b/im_chat_update.php @@ -0,0 +1,20 @@ + NOW() - interval 5 minute"; + } else { + $sql = "select chat_id, time(chat_time) as short_chat_time, name, content from chat, users where users.user_id = chat.user_id and chat_id > ".$_GET["id"]." limit 100"; + } +$result = mysql_query($sql); +$chat_data = '{"m":['; +if(mysql_num_rows($result)){ + while($row = mysql_fetch_array($result)){ + $chat_data .= '{"id": '.$row[chat_id].',"t":"'.$row[short_chat_time].'","n":"'.$row[name].'","c":"'.$row[content].'"},'; + } + $chat_data = substr($chat_data, 0, -1); + $chat_data .= ']}'; +} else $chat_data .= "]}"; +echo $chat_data; +?> diff --git a/im_send_message.php b/im_send_message.php new file mode 100644 index 0000000..52ea093 --- /dev/null +++ b/im_send_message.php @@ -0,0 +1,8 @@ + diff --git a/im_user_update.php b/im_user_update.php new file mode 100644 index 0000000..226ba3b --- /dev/null +++ b/im_user_update.php @@ -0,0 +1,17 @@ + NOW()-300 order by name"; + +$result = mysql_query($sql); +$users_online = ""; +while($row = mysql_fetch_array($result)) +{ + $users_online .= '
    '.$row['name'].'
    '; +} + +echo $users_online; + +?> diff --git a/manage.php b/manage.php index efae3b8..a182c44 100644 --- a/manage.php +++ b/manage.php @@ -39,7 +39,6 @@ if($comment_count == 0) { $comment_time = absHumanTiming($comment_max); } - $sql = 'select count(*), max(timeposted) from filecom'; $result = mysql_query($sql); @@ -53,7 +52,6 @@ if($filecomm_count == 0) { $filecomm_time = absHumanTiming($filecomm_max); } - $sql = 'select count(*), max(time_post) from files'; $result = mysql_query($sql); @@ -75,6 +73,21 @@ $result = mysql_query($sql); $row = mysql_fetch_row($result); $std_locked = $row[0]; +$sql = 'select max(chat_time) from chat'; + +$result = mysql_query($sql); +$row = mysql_fetch_row($result); +$chat_max = $row[0]; +$chat_max_time = absHumanTiming($chat_max); + +$sql = 'select count(*) from chat'; +$result = mysql_query($sql); +$row = mysql_fetch_row($result); +$chat_count = $row[0]; + +// number of chat messages by hour +//$sql = 'select hour(chat_time) as chat_hour, count(*) from chat group by chat_hour order by chat_hour'; + // ADIMINISTRATOR MENU ?>
    @@ -113,7 +126,8 @@ $std_locked = $row[0];
    - + + diff --git a/sfx/beep.wav b/sfx/beep.wav new file mode 100644 index 0000000000000000000000000000000000000000..c89a3982df13c1db7482787e1727d0b1ef9d213b GIT binary patch literal 10362 zcwX(=X;71Q0>|+`xf61d0}?{y3W0<}R79YiRS|YU!~+4Hda>?e6>rh?tXmIQYZYDV zF*>VO>#S1hiAUF>t`!lioZ$#ZB!pZfP>OQyj8kwfF441EsUjh{o( zlH+LW7$nwS&YchoFEy-Xk}6_N^l(gd+-0#QNgZFA*2TT}VsqQ(=1Uzq>HY3D8M}X; z{PbXwvRaj)%^lGgM5axa)3zArM)xi6ys;W60W<_0!raHZ)jJx3`)bh8hh-$(+1k# z<_&EbHmECf&3c@1uKA#~*}lr9_gH<^<23L!NJf8!?Zxv*%gJ79IpaK&`R}4>VJjw? zBW6S|i`f(RwRlI8F1`XTn(_i_-QB#oW0ka`yH7^%UjP?lW--S ztXf^KXq(rPD^2fQ((_$!d;f;FHx*80sJce$7@0oWYFcRRw2wP;J$rnuV=d51a2VBu zS&df_y@99TqFiP^`&n=a?+RZjI0P4!#N@{YOIF5!BqfcXJ6KY9vauHl~8ocx?AyY&5 zgw;(ditLGQi!sJ2;G*jIJ831n*Dp%j6wL&wL3+EpN4BNEQch4@RSv7-wRIyy28n6C z1!w0wFS=8Gd&jBvyFo zr_%FP*Xn=MUfVJvz18`;$JRR)UV5Km?{J-ZTzg5+FlL)8txa~HbGrxcFCG5@dIm)3 z58-Q+Px=U6I-2nnQ^k%6X@HAvgqLoQ+7v^IOBWwWx)z_6riP1lwwm8$c9cok-CJek z{>AcRgY82k)gp~Sx5nT$;w@LAX%&cV4f$U-Wj90t^e)8?`q_=8i5k z=`E#p$oV_Zr@s2JVTcE2q53dZTse_Ko=-hXkAsW;xb$-VsDK%9EJ_R)XF4P>+z1EYBv&?s`MULaHVb2P`0P;g-unqkM zR`x&IrH705$w2=}xonW9tW{0d=8dQkvx}%h$}S3AbiWQ54jB2C<+kgNWcM2H2?Xsr ziI`n0T_(?{@BX+CGJzfFD(ogzl18f&w zKq@9*pi1d{=7R~lChVH9>nCl)4Vr*^KroWhC`~jIBbBv_!$iogXy$}n6LwA5^`GqeJ7RXJ z3}VwdcJJRew1$)G=gpQO(Pw{hA0d4eT4GmcXha+jAGwsz8;2peK{UHnDZHIsmhU9STU zU>@NBy!307EP7?oE7scJJ}#ZV5HY)+BV^YM)=mzG8x?v#EGfJ(GDw&pa>NaYdz142 z&+PI-R=DVSYzuw~=_+}cx}O19Y|icf+OGNXvx8z~j_O;@*vRqGYSVFRq2r<}9X@m6 zxEtz+umRnuPcTPuT*3yThx9RdC*?D$l{STOkFlTW4LZTj%PCmQ0s!RXXV1?m$X-l< OkF(cq+qQPoM({7evkwXY literal 0 HcwPel00001 diff --git a/sfx/click.wav b/sfx/click.wav new file mode 100644 index 0000000000000000000000000000000000000000..a124ddd079ad34022f65afbcba0028fd3bbd7ed0 GIT binary patch literal 6394 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 T|Kpw@;TXlmtb!seyY4>$k%eQE literal 0 HcwPel00001 diff --git a/style.css b/style.css index eccf28e..26c0559 100644 --- a/style.css +++ b/style.css @@ -62,32 +62,57 @@ table.gridtable td { border-color: #666666; background-color: #ffffff; } -.menu { - /*background-color: #333;*/ + +.login_menu { + position: relative; + float: right; + top: 0px; + right: 0px; + padding-right: 10px; } -.menu ul { +.logout_button { + background-color: #f00; + color: #fff; +} + +.logout_button:hover { + background-color: #000; + color: #f00; +} + +.main_menu { + position: absolute; + top: 0px; + left: 0px; + background-color: #ececec; + border-bottom: 2px solid #000; + width: 100%; + padding-top: 5px; + padding-bottom: 5px; +} + +.main_menu ul { margin: 0; padding: 0; - float: left; } -.menu ul li { +.main_menu ul li { display: inline; } -.menu ul li a { +.main_menu ul li a { float: left; text-decoration: none; margin-left: 25px; } -.menu ul li a:visited { +.main_menu ul li a:visited { text-decoration: none; } -.menu ul li a:hover, .menu ul li .current { +.main_menu ul li a:hover, .menu ul li .current { color: #000; border-bottom: 2px solid #000; } @@ -120,12 +145,6 @@ table.gridtable td { } */ - -.header { - position: absolute; - top: 5px; - right: 20px; -} .highlight { background: #fff } .line_numbers { background-color: #ececec; -- 2.11.4.GIT
    StatValueHuman TimeLast Updated
    Files:
    Chat Messages:
    Files:
    File Comments:
    Comments:
    Assignments: