diff --git a/src/main/java/me/imsonmia/epqapi/config/SqlConfig.java b/src/main/java/me/imsonmia/epqapi/config/SqlConfig.java
new file mode 100644
index 0000000..764fb85
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/config/SqlConfig.java
@@ -0,0 +1,4 @@
+package me.imsonmia.epqapi.config;
+
+public interface SqlConfig {
+}
diff --git a/src/main/java/me/imsonmia/epqapi/config/WebSocketConfig.java b/src/main/java/me/imsonmia/epqapi/config/WebSocketConfig.java
index 64f5dd9..d464af9 100644
--- a/src/main/java/me/imsonmia/epqapi/config/WebSocketConfig.java
+++ b/src/main/java/me/imsonmia/epqapi/config/WebSocketConfig.java
@@ -17,5 +17,6 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*");
+
}
}
diff --git a/src/main/java/me/imsonmia/epqapi/model/Message.java b/src/main/java/me/imsonmia/epqapi/model/Message.java
index f152f0b..47148b4 100644
--- a/src/main/java/me/imsonmia/epqapi/model/Message.java
+++ b/src/main/java/me/imsonmia/epqapi/model/Message.java
@@ -13,6 +13,7 @@ public class Message {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
Long id;
+ MessageType type;
String fromUserId;
String toUserId;
String content;
@@ -20,6 +21,9 @@ public class Message {
public Long getId() {
return id;
}
+ public MessageType getType() {
+ return type;
+ }
public String getFromUserId() {
return fromUserId;
}
@@ -44,15 +48,20 @@ public class Message {
public void setTimeMillis(Long timeMillis) {
this.timeMillis = timeMillis;
}
+ public void setType(MessageType type) {
+ this.type = type;
+ }
public Message() {
}
public Message(Long id,
+ MessageType type,
String fromUserId,
String toUserId,
String content,
Long timeMillis) {
this.id = id;
+ this.type = type;
this.fromUserId = fromUserId;
this.toUserId = toUserId;
this.content = content;
diff --git a/src/main/java/me/imsonmia/epqapi/model/MessageType.java b/src/main/java/me/imsonmia/epqapi/model/MessageType.java
new file mode 100644
index 0000000..bc8cfe0
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/model/MessageType.java
@@ -0,0 +1,8 @@
+package me.imsonmia.epqapi.model;
+
+public enum MessageType {
+ MESSAGE,
+ SYSTEM,
+ HELLO,
+ DATA,
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 0ead42d..cff589b 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,6 +1,6 @@
-spring.datasource.url=jdbc:mariadb://127.0.0.1:3306/test
+spring.datasource.url=jdbc:mariadb://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=dbuser
spring.datasource.password=dbpasswd
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
-spring.jpa.show-sql: false
-spring.jpa.hibernate.ddl-auto=create-drop
\ No newline at end of file
+spring.jpa.show-sql: true
+spring.jpa.hibernate.ddl-auto=create-drop
diff --git a/src/main/resources/static/asset-manifest.json b/src/main/resources/static/asset-manifest.json
index 50dc02e..bc62b34 100644
--- a/src/main/resources/static/asset-manifest.json
+++ b/src/main/resources/static/asset-manifest.json
@@ -1,13 +1,13 @@
{
"files": {
- "main.css": "/static/css/main.e6c13ad2.css",
- "main.js": "/static/js/main.a029d655.js",
+ "main.css": "/static/css/main.7bfab64e.css",
+ "main.js": "/static/js/main.837b405a.js",
"index.html": "/index.html",
- "main.e6c13ad2.css.map": "/static/css/main.e6c13ad2.css.map",
- "main.a029d655.js.map": "/static/js/main.a029d655.js.map"
+ "main.7bfab64e.css.map": "/static/css/main.7bfab64e.css.map",
+ "main.837b405a.js.map": "/static/js/main.837b405a.js.map"
},
"entrypoints": [
- "static/css/main.e6c13ad2.css",
- "static/js/main.a029d655.js"
+ "static/css/main.7bfab64e.css",
+ "static/js/main.837b405a.js"
]
}
\ No newline at end of file
diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html
index 765a116..98fd3ae 100644
--- a/src/main/resources/static/index.html
+++ b/src/main/resources/static/index.html
@@ -1 +1 @@
-
IRC application instanceCopyright 2024-2025 Zhongheng Liu @ Byron College
\ No newline at end of file
+IRC application instanceCopyright 2024-2025 Zhongheng Liu @ Byron College
\ No newline at end of file
diff --git a/src/main/resources/static/static/css/main.7bfab64e.css b/src/main/resources/static/static/css/main.7bfab64e.css
new file mode 100644
index 0000000..3db283a
--- /dev/null
+++ b/src/main/resources/static/static/css/main.7bfab64e.css
@@ -0,0 +1,2 @@
+body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.chat-inner-wrapper{display:flex;flex-direction:column-reverse;height:500px;overflow-wrap:normal;overflow-y:auto}.entry-box{margin-top:5px}.chat{min-height:80vh;position:relative}body{background-color:#000;color:#0f3}.App{margin:3%;min-height:100vh}
+/*# sourceMappingURL=main.7bfab64e.css.map*/
\ No newline at end of file
diff --git a/src/main/resources/static/static/css/main.7bfab64e.css.map b/src/main/resources/static/static/css/main.7bfab64e.css.map
new file mode 100644
index 0000000..899b3ee
--- /dev/null
+++ b/src/main/resources/static/static/css/main.7bfab64e.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/css/main.7bfab64e.css","mappings":"AAAA,KAKE,kCAAmC,CACnC,iCAAkC,CAJlC,mIAEY,CAHZ,QAMF,CAEA,KACE,uEAEF,CCZA,oBAII,YAAa,CACb,6BAA8B,CAJ9B,YAAa,CAEb,oBAAqB,CADrB,eAKJ,CACA,WACI,cACJ,CACA,MACI,eAAgB,CAChB,iBACJ,CCdA,KACE,qBAAuB,CACvB,UACF,CACA,KACE,SAAU,CACV,gBACF","sources":["index.css","Chat/Chat.css","App.css"],"sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n",".chat-inner-wrapper {\n height: 500px;\n overflow-y: auto;\n overflow-wrap: normal;\n display: flex;\n flex-direction: column-reverse;\n\n}\n.entry-box {\n margin-top: 5px;\n}\n.chat {\n min-height: 80vh;\n position: relative;\n}","body {\n background-color: black;\n color: #00FF33;\n}\n.App {\n margin: 3%;\n min-height: 100vh;\n}"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/src/main/resources/static/static/css/main.e6c13ad2.css b/src/main/resources/static/static/css/main.e6c13ad2.css
deleted file mode 100644
index 50410fa..0000000
--- a/src/main/resources/static/static/css/main.e6c13ad2.css
+++ /dev/null
@@ -1,2 +0,0 @@
-body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}
-/*# sourceMappingURL=main.e6c13ad2.css.map*/
\ No newline at end of file
diff --git a/src/main/resources/static/static/css/main.e6c13ad2.css.map b/src/main/resources/static/static/css/main.e6c13ad2.css.map
deleted file mode 100644
index 5c4dfb9..0000000
--- a/src/main/resources/static/static/css/main.e6c13ad2.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"static/css/main.e6c13ad2.css","mappings":"AAAA,KAKE,kCAAmC,CACnC,iCAAkC,CAJlC,mIAEY,CAHZ,QAMF,CAEA,KACE,uEAEF","sources":["index.css"],"sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/src/main/resources/static/static/js/main.a029d655.js b/src/main/resources/static/static/js/main.837b405a.js
similarity index 85%
rename from src/main/resources/static/static/js/main.a029d655.js
rename to src/main/resources/static/static/js/main.837b405a.js
index 81632e6..f5aeabb 100644
--- a/src/main/resources/static/static/js/main.a029d655.js
+++ b/src/main/resources/static/static/js/main.837b405a.js
@@ -1,3 +1,3 @@
-/*! For license information please see main.a029d655.js.LICENSE.txt */
-(()=>{"use strict";var e={71:(e,t,n)=>{var r=n(791);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n]/;function v(e){if("boolean"===typeof e||"number"===typeof e)return""+e;e=""+e;var t=g.exec(e);if(t){var n,r="",a=0;for(n=t.index;n"),C(e,l,n),"string"===typeof n?(e.push(v(n)),null):n}var T=/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/,P=new Map;function N(e){var t=P.get(e);if(void 0===t){if(!T.test(e))throw Error(a(65,e));t="<"+e,P.set(e,t)}return t}function F(e,t,n,l,i){switch(t){case"select":e.push(N("select"));var u=null,c=null;for(h in n)if(o.call(n,h)){var d=n[h];if(null!=d)switch(h){case"children":u=d;break;case"dangerouslySetInnerHTML":c=d;break;case"defaultValue":case"value":break;default:_(e,l,h,d)}}return e.push(">"),C(e,c,u),u;case"option":c=i.selectedValue,e.push(N("option"));var f=d=null,p=null,h=null;for(u in n)if(o.call(n,u)){var m=n[u];if(null!=m)switch(u){case"children":d=m;break;case"selected":p=m;break;case"dangerouslySetInnerHTML":h=m;break;case"value":f=m;default:_(e,l,u,m)}}if(null!=c)if(n=null!==f?""+f:function(e){var t="";return r.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(d),k(c)){for(l=0;l"),C(e,h,d),d;case"textarea":for(d in e.push(N("textarea")),h=c=u=null,n)if(o.call(n,d)&&null!=(f=n[d]))switch(d){case"children":h=f;break;case"value":u=f;break;case"defaultValue":c=f;break;case"dangerouslySetInnerHTML":throw Error(a(91));default:_(e,l,d,f)}if(null===u&&null!==c&&(u=c),e.push(">"),null!=h){if(null!=u)throw Error(a(92));if(k(h)&&1"),null;case"menuitem":for(var g in e.push(N("menuitem")),n)if(o.call(n,g)&&null!=(u=n[g]))switch(g){case"children":case"dangerouslySetInnerHTML":throw Error(a(400));default:_(e,l,g,u)}return e.push(">"),null;case"title":for(m in e.push(N("title")),u=null,n)if(o.call(n,m)&&null!=(c=n[m]))switch(m){case"children":u=c;break;case"dangerouslySetInnerHTML":throw Error(a(434));default:_(e,l,m,c)}return e.push(">"),u;case"listing":case"pre":for(f in e.push(N(t)),c=u=null,n)if(o.call(n,f)&&null!=(d=n[f]))switch(f){case"children":u=d;break;case"dangerouslySetInnerHTML":c=d;break;default:_(e,l,f,d)}if(e.push(">"),null!=c){if(null!=u)throw Error(a(60));if("object"!==typeof c||!("__html"in c))throw Error(a(61));null!==(n=c.__html)&&void 0!==n&&("string"===typeof n&&0"),null;case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return E(e,n,t,l);case"html":return 0===i.insertionMode&&e.push(""),E(e,n,t,l);default:if(-1===t.indexOf("-")&&"string"!==typeof n.is)return E(e,n,t,l);for(p in e.push(N(t)),c=u=null,n)if(o.call(n,p)&&null!=(d=n[p]))switch(p){case"children":u=d;break;case"dangerouslySetInnerHTML":c=d;break;case"style":x(e,l,d);break;case"suppressContentEditableWarning":case"suppressHydrationWarning":break;default:s(p)&&"function"!==typeof d&&"symbol"!==typeof d&&e.push(" ",p,'="',v(d),'"')}return e.push(">"),C(e,c,u),u}}function R(e,t,n){if(e.push('\x3c!--$?--\x3e')}var I=/[<\u2028\u2029]/g;function z(e){return JSON.stringify(e).replace(I,(function(e){switch(e){case"<":return"\\u003c";case"\u2028":return"\\u2028";case"\u2029":return"\\u2029";default:throw Error("escapeJSStringsForInstructionScripts encountered a match it does not know how to replace. this means the match regex and the replacement characters are no longer in sync. This is a bug in React")}}))}function L(e,t,n,r){return n.generateStaticMarkup?(e.push(v(t)),!1):(""===t?e=r:(r&&e.push("\x3c!-- --\x3e"),e.push(v(t)),e=!0),e)}var M=Object.assign,O=Symbol.for("react.element"),D=Symbol.for("react.portal"),B=Symbol.for("react.fragment"),V=Symbol.for("react.strict_mode"),U=Symbol.for("react.profiler"),H=Symbol.for("react.provider"),A=Symbol.for("react.context"),W=Symbol.for("react.forward_ref"),j=Symbol.for("react.suspense"),$=Symbol.for("react.suspense_list"),q=Symbol.for("react.memo"),Q=Symbol.for("react.lazy"),K=Symbol.for("react.scope"),G=Symbol.for("react.debug_trace_mode"),Y=Symbol.for("react.legacy_hidden"),X=Symbol.for("react.default_value"),Z=Symbol.iterator;function J(e){if(null==e)return null;if("function"===typeof e)return e.displayName||e.name||null;if("string"===typeof e)return e;switch(e){case B:return"Fragment";case D:return"Portal";case U:return"Profiler";case V:return"StrictMode";case j:return"Suspense";case $:return"SuspenseList"}if("object"===typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case H:return(e._context.displayName||"Context")+".Provider";case W:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case q:return null!==(t=e.displayName||null)?t:J(e.type)||"Memo";case Q:t=e._payload,e=e._init;try{return J(e(t))}catch(n){}}return null}var ee={};function te(e,t){if(!(e=e.contextTypes))return ee;var n,r={};for(n in e)r[n]=t[n];return r}var ne=null;function re(e,t){if(e!==t){e.context._currentValue2=e.parentValue,e=e.parent;var n=t.parent;if(null===e){if(null!==n)throw Error(a(401))}else{if(null===n)throw Error(a(401));re(e,n)}t.context._currentValue2=t.value}}function ae(e){e.context._currentValue2=e.parentValue,null!==(e=e.parent)&&ae(e)}function oe(e){var t=e.parent;null!==t&&oe(t),e.context._currentValue2=e.value}function le(e,t){if(e.context._currentValue2=e.parentValue,null===(e=e.parent))throw Error(a(402));e.depth===t.depth?re(e,t):le(e,t)}function ie(e,t){var n=t.parent;if(null===n)throw Error(a(402));e.depth===n.depth?re(e,n):ie(e,n),t.context._currentValue2=t.value}function ue(e){var t=ne;t!==e&&(null===t?oe(e):null===e?ae(t):t.depth===e.depth?re(t,e):t.depth>e.depth?le(t,e):ie(t,e),ne=e)}var se={isMounted:function(){return!1},enqueueSetState:function(e,t){null!==(e=e._reactInternals).queue&&e.queue.push(t)},enqueueReplaceState:function(e,t){(e=e._reactInternals).replace=!0,e.queue=[t]},enqueueForceUpdate:function(){}};function ce(e,t,n,r){var a=void 0!==e.state?e.state:null;e.updater=se,e.props=n,e.state=a;var o={queue:[],replace:!1};e._reactInternals=o;var l=t.contextType;if(e.context="object"===typeof l&&null!==l?l._currentValue2:r,"function"===typeof(l=t.getDerivedStateFromProps)&&(a=null===(l=l(n,a))||void 0===l?a:M({},a,l),e.state=a),"function"!==typeof t.getDerivedStateFromProps&&"function"!==typeof e.getSnapshotBeforeUpdate&&("function"===typeof e.UNSAFE_componentWillMount||"function"===typeof e.componentWillMount))if(t=e.state,"function"===typeof e.componentWillMount&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),t!==e.state&&se.enqueueReplaceState(e,e.state,null),null!==o.queue&&0>=l,a-=l,{id:1<<32-pe(t)+a|n<>>=0)?32:31-(he(e)/me|0)|0},he=Math.log,me=Math.LN2;var ge="function"===typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e===1/t)||e!==e&&t!==t},ve=null,ye=null,be=null,ke=null,Se=!1,we=!1,xe=0,_e=null,Ce=0;function Ee(){if(null===ve)throw Error(a(321));return ve}function Te(){if(0")}o.lastPushedText=!1}}function Ge(e,t,n){if(t.node=n,"object"===typeof n&&null!==n){switch(n.$$typeof){case O:return void Ke(e,t,n.type,n.props,n.ref);case D:throw Error(a(257));case Q:var r=n._init;return void Ge(e,t,n=r(n._payload))}if(k(n))return void Ye(e,t,n);if(null===n||"object"!==typeof n?r=null:r="function"===typeof(r=Z&&n[Z]||n["@@iterator"])?r:null,r&&(r=r.call(n))){if(!(n=r.next()).done){var o=[];do{o.push(n.value),n=r.next()}while(!n.done);Ye(e,t,o)}return}throw e=Object.prototype.toString.call(n),Error(a(31,"[object Object]"===e?"object with keys {"+Object.keys(n).join(", ")+"}":e))}"string"===typeof n?(r=t.blockedSegment).lastPushedText=L(t.blockedSegment.chunks,n,e.responseState,r.lastPushedText):"number"===typeof n&&((r=t.blockedSegment).lastPushedText=L(t.blockedSegment.chunks,""+n,e.responseState,r.lastPushedText))}function Ye(e,t,n){for(var r=n.length,a=0;a');case 1:n.status=2;var o=!0;r=n.chunks;var l=0;n=n.children;for(var i=0;i")),rt(e,t,n),e=!!e.responseState.generateStaticMarkup||t.push("\x3c!--/$--\x3e");if(0e.progressiveChunkSize)return r.rootSegmentID=e.nextSegmentId++,e.completedBoundaries.push(r),R(t,e.responseState,r.id),rt(e,t,n),t.push("\x3c!--/$--\x3e");if(e.responseState.generateStaticMarkup||t.push("\x3c!--$--\x3e"),1!==(n=r.completedSegments).length)throw Error(a(391));return at(e,t,n[0]),e=!!e.responseState.generateStaticMarkup||t.push("\x3c!--/$--\x3e")}function ot(e,t,n){return function(e,t,n,r){switch(n.insertionMode){case 0:case 1:return e.push('');case 2:return e.push('