Inital Client.

This commit is contained in:
ui_creeperlv 2024-03-29 23:36:10 +05:30
parent aef6411fa7
commit e34565ec73
10 changed files with 561 additions and 7 deletions

261
.gitignore vendored Normal file
View File

@ -0,0 +1,261 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

36
example/index.js Normal file
View File

@ -0,0 +1,36 @@
require("dotenv").config();
const { Client, Events, Message } = require("../index");
let connectx = new Client(process.env['TOKEN']);
connectx.on(Events.LOG , (data) => {
console.log(data);
});
connectx.on(Events.ERROR , (data) => {
console.log(data);
});
connectx.on(Events.CLIENT_READY , async (data) => {
console.log(data);
console.log(await connectx.servers());
let message = new Message();
message.authorIcon = "https://static.wikia.nocookie.net/digitousailorcure/images/0/09/Anya_forger.png";
message.authorName = "Anya Forger";
message.serverIcon = "https://static.wikia.nocookie.net/digitousailorcure/images/0/09/Anya_forger.png";
message.serverName = "Forger's Basement";
message.message = "Waku Waku";
console.log(await connectx.send(
message.toArray()
));
});
connectx.on(Events.MESSAGE , (data) => {
console.log(data);
});
connectx.login();

10
index.js Normal file → Executable file
View File

@ -1 +1,9 @@
module.exports = {} const Client = require("./src/Client");
const Events = require("./src/Events");
const Message = require("./src/Message");
module.exports = {
Client: Client,
Events: Events,
Message: Message
}

35
node_modules/.package-lock.json generated vendored Normal file → Executable file
View File

@ -1,10 +1,39 @@
{ {
"name": "connectx.js",
"version": "0.0.1-hold",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"node_modules/connectx.js": { "node_modules/dotenv": {
"resolved": "", "version": "16.4.5",
"link": true "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
"integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/ws": {
"version": "8.16.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
} }
} }
} }

1
node_modules/connectx.js generated vendored
View File

@ -1 +0,0 @@
..

48
package-lock.json generated Normal file
View File

@ -0,0 +1,48 @@
{
"name": "connectx.js",
"version": "0.0.1-hold",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "connectx.js",
"version": "0.0.1-hold",
"license": "AGPL-3.0-or-later",
"dependencies": {
"dotenv": "^16.4.5",
"ws": "^8.16.0"
}
},
"node_modules/dotenv": {
"version": "16.4.5",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
"integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/ws": {
"version": "8.16.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
}
}
}

8
package.json Normal file → Executable file
View File

@ -4,7 +4,7 @@
"description": "HOLD", "description": "HOLD",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"test": "node tests/example.js" "test": "node example/index.js"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -18,5 +18,9 @@
"messages" "messages"
], ],
"author": "Unbound LLC", "author": "Unbound LLC",
"license": "AGPL-3.0-or-later" "license": "AGPL-3.0-or-later",
"dependencies": {
"dotenv": "^16.4.5",
"ws": "^8.16.0"
}
} }

109
src/Client.js Normal file
View File

@ -0,0 +1,109 @@
const WebSocket = require('ws');
const Message = require('./Message');
class Client {
constructor(token) {
this.token = token;
this.clientUri = "https://connectx.unboundllc.tech/";
this.events = {};
this.clientid = null;
this.websocket = null;
}
on(event, callback) {
this.events[event] = this.events[event] || [];
this.events[event].push(callback);
}
login(){
this.websocket = new WebSocket(this.clientUri + "ws", {
headers: {
'Authorization': `Basic ${this.token}`
}
});
this.websocket.onopen = () => {
this.websocket.send("login");
this.trigger("log" , "Connected to WebSocket Server Successfully");
};
this.websocket.onclose = () => {
this.trigger("disconnect" , new Date())
}
this.websocket.onerror = (error) => {
this.trigger("disconnect" , new Date());
}
this.websocket.onmessage = (event) => {
let data = JSON.parse(event.data);
let main_event = data.event;
delete data.event;
if(main_event == "ready"){
this.clientid = data.authorId;
}
if(main_event == "message"){
this.trigger(main_event , data.data)
}else{
this.trigger(main_event , {
...data
})
}
};
}
async servers() {
const headers = new Headers();
headers.append("Authorization", `Basic ${this.token}`);
const requestOptions = {
method: "GET",
headers: headers,
redirect: "follow"
};
let response = await fetch(`${this.clientUri}api/servers`, requestOptions);
let result = await response.json();
return result.servers;
}
/**
*
* @param {Message} MessageData
*/
async send(MessageData) {
const headers = new Headers();
headers.append("Authorization", `Basic ${this.token}`);
const formdata = new FormData();
formdata.append("authorName", MessageData.authorName);
formdata.append("authorIcon", MessageData.authorIcon);
formdata.append("serverName", MessageData.serverName);
formdata.append("serverIcon", MessageData.serverIcon);
formdata.append("fields", MessageData.fields);
formdata.append("message", MessageData.message);
const requestOptions = {
method: "POST",
headers: headers,
body: formdata,
redirect: "follow"
};
let response = await fetch(`${this.clientUri}api/message`, requestOptions);
let result = await response.json();
return result.message;
}
trigger(event, data) {
if (this.events[event]) {
for (const callback of this.events[event]) {
callback(data);
}
}
}
}
module.exports = Client;

7
src/Events.js Normal file
View File

@ -0,0 +1,7 @@
module.exports = {
CLIENT_READY: "ready",
MESSAGE: "message",
ERROR: "error",
LOG: "log",
DISCONNECT: "disconnect"
}

53
src/Message.js Normal file
View File

@ -0,0 +1,53 @@
class Message {
/**
* @typedef {Object} MessageFields
* @property {string|null} authorName
* @property {URL|null} authorIcon
* @property {string|null} serverName
* @property {string|null} serverIcon
* @property {string|null} message
* @property {string|null} fields
* @property {boolean|null} isSameId
*/
constructor() {
this.authorName = null;
this.authorIcon = "auto";
this.serverName = null;
this.serverIcon = null;
this.message = null;
this.fields = [];
this.isSameId = false;
}
/**
* Fill Product fields with new values
* @param {MessageFields} newFields - Object containing new values for Category fields
*/
fill (newFields) {
for (let field in newFields) {
if (this.hasOwnProperty(field) && newFields.hasOwnProperty(field)) {
if (this[field] !== 'undefined') {
this[field] = newFields[field];
}
}
}
return this.toArray();
}
toArray() {
return {
authorName: this.authorName,
authorIcon: this.authorIcon,
serverName: this.serverName,
serverIcon: this.serverIcon,
message: this.message,
fields: this.fields,
isSameId: this.isSameId
};
}
}
module.exports = Message;