Untitled
unknown
plain_text
2 years ago
11 kB
14
Indexable
const tls = require('tls');
const crypto = require('crypto');
const EventEmitter = require('events');
const { SendApi, setup_network, send_message, send_button_message, SendAfmApi } = require("./sendHttpRequest");
const express = require('express');
const app = express();
var http = require("http").Server(app);
const fs = require('fs');
const path = require('path');
class Server extends EventEmitter {
constructor(server, port, password) {
super();
this.server_name = "azerforum.smartbee.az";
this.server = server;
this.sUID = "";
this.port = port;
this.password = password;
this.connect();
this.startPing();
this.aUsers = [];
this.UserList = [];
this.channels = [];
}
connect() {
const options = {
rejectUnauthorized: false,
ciphers: 'ECDHE-ECDSA-AES256-GCM-SHA384'
};
this.socket = tls.connect(this.port, this.server, options, () => {
this.initializeConnection();
this.Security();
this.SVSLog("Services is now online and synced. Starting... ");
this.emit('connected');
});
this.socket.on('data', (data) => {
var rawData = data.toString();
var lines = rawData.split('\n');
lines.forEach((line) => {
console.log(line);
if (line.indexOf('Z :') !== -1) {
line = line.split('Z :')[1];
}
if (line.indexOf('UID') !== -1) {
this.UserParse(line);
}
if (line.indexOf('SJOIN') !== -1) {
this.SJOIN(line);
this.emit('SJOIN', line );
}
if (line.indexOf('PRIVMSG') !== -1) {
this.PRIVMSG(line);
this.emit('PRIVMSG', line );
}
if (line.indexOf('NICK') !== -1) {
this.NICK(line);
this.emit('NICK', line );
}
if (line.indexOf('VERSION') !== -1) {
this.VERSION(line);
this.emit('VERSION', line );
}
if (line.indexOf('MOTD') !== -1) {
this.MOTD(line);
this.emit('MOTD', line );
}
});
});
this.socket.on('error', (error) => {
console.error('Error:', error);
this.SVSLog("Error");
});
this.socket.on('end', () => {
this.SVSLog('Disconnected from server');
});
}
initializeConnection() {
this.sendRaw("PASS " + this.password);
this.sendRaw("PROTOCTL EAUTH="+this.server_name+",6000,,Smartbee-v1 SID=69L");
this.sendRaw("PROTOCTL NOQUIT NICKv2 SJOIN SJOIN2 SJ3 CLK TKLEXT2 NICKIP ESVID MLOCK NEXTBANS EXTSWHOIS SJSBY MTAGS");
this.sendRaw("SERVER "+this.server_name+" 1 :SmartBEE IRC Server");
this.sendRaw("EOS");
}
sendRaw(string) {
if (this.socket && this.socket.writable) {
this.socket.write(string + '\n');
}
}
clean(line) {
return line;
if (line.startsWith(':')) {
return line.slice(1);
}
return line;
}
startPing() {
setInterval(() => {
this.sendRaw("PING :web.smartbee.az");
}, 30000);
}
AddServ(nickname) {
const uid = this.generateUid(nickname);
this.sendRaw("UID " + nickname + " 0 " + this.ServerTime() + " services smartbee.az " + uid + " 0 +io * * * :" + nickname);
this.sendRaw("SJOIN " + this.ServerTime() + " " + "#services :" + uid);
this.sendRaw("MODE #services +o " + nickname);
this.sendRaw("SJOIN " + this.ServerTime() + " " + "#chat :" + uid);
this.sendRaw("MODE #chat +o " + nickname);
this.sUID = uid;
this.aUsers[uid] = { "user_name": nickname };
}
UserParse(line) {
var uline = line.split(':')[1];
const parts = line.split(' ');
const SID = parts[1];
const UID = parts[8];
const nick = parts[3];
const time = parts[5];
const ident = parts[6];
const ip = parts[7];
const ip_prefix = parts[12];
const mode = parts[10];
const id = parts[13];
this.aUsers[UID] = {
"UID": UID,
"nick": nick,
"ident": ident,
"ip": ip,
"ip_prefix": ip_prefix,
"time": time,
"mode":mode,
"id":id
};
this.emit('user', this.aUsers[UID] );
}
TKL(line)
{
const tline = line.split('TKL ')[1];
const parts = tline.split(' ');
const message = parts.slice(7).join(' '); // Corrected to avoid additional spaces
const isAddition = parts[0] === "+";
const type = parts[1];
const userThing = parts[2]; // "user-thing", often "*"
const mask = parts[3];
const setBy = parts[4];
const expiry = parts[5];
const timestamp = parts[6];
this.SVSLog(`TKL ${isAddition ? '+' : '-'} ${type} ${userThing} ${mask} ${setBy} ${expiry} ${timestamp} ${message}`);
}
MOTD(line)
{
const parts = line.split(' ');
const UID = this.clean(parts[0]);
this.S2S("422 "+this.clean(UID)+" :No MOTD found. (E-mail: info@smartbee.az)");
this.SVSLog(this.aUsers[UID]['nick']+" /motd "+this.server_name);
console.log(parts);
}
VERSION(line)
{
if (line.startsWith(':')) {
line = line.slice(1);
}
const parts = line.split(' ');
const UID = this.clean(parts[0]);
this.S2S("351 "+this.clean(UID)+" :Smartbee.az(IRCD services) 1.0.0. "+this.server_name);
this.SVSLog(this.aUsers[UID]['nick']+" /VERSION "+this.server_name);
console.log(line);
}
NICK(line)
{
console.log(line);
}
SJOIN(line)
{
const parts = line.split(' ');
const channel = parts[3];
const uid = this.clean(parts[4]);
if (!this.channels || !this.channels[channel]) {
//this.sendRaw("SJOIN " + this.ServerTime() + " " + channel + " :" + this.sUID);
//this.sendRaw("SVS2MODE "+channel+" +o Security");
//this.sendRaw(":"+this.sUID+" MODE "+channel+" +o Security");
this.channels[channel] = 1;
}
}
PRIVMSG(line) {
const parts = line.split(' ');
const uid = parts[2];
const uid0 = parts[0];
const message = parts.slice(3).join(' '); // Corrected to avoid additional spaces
if (this.aUsers[uid]) {
this.SVSLog("Private " + uid0 + " " + uid + " " + message);
this.S2S(":" + uid + " PRIVMSG "+uid0+" " + message);
} else {
//this.SVSLog("Channel " + uid0 + " " + uid + " " + message);
}
}
ServerTime() {
return Math.floor(Date.now() / 1000);
}
Security() {
//this.AddServ("AINServ");
this.AddServ("Security");
}
generateUid(str) {
const hash = crypto.createHash('md5').update(str).digest('hex');
return "69L" + hash.substring(0, 6).toUpperCase();
}
new_msgid() {
const bytes = crypto.randomBytes(24);
return bytes.toString('base64');
}
S2S(string) {
this.sendRaw(string);
}
SVSLog(string) {
this.S2S(":" + this.sUID + " PRIVMSG #services :" + string);
}
joinChannelWithUser(nickname, user_id, channel, email) {
const uid = this.generateUid(nickname);
const timestamp = Math.floor(Date.now() / 1000);
this.sendRaw("UID " + nickname + " 0 " + timestamp + " " + user_id + " " + nickname + ".smartbee.az " + uid + " 0 +iwxzWr * * * :" + email);
this.sendRaw("SJOIN " + timestamp + " " + channel + " :" + uid);
this.S2S("SWHOIS " + uid + " :is logged in as " + email);
this.S2S("SWHOIS " + uid + " :is connecting from Azerbaijan");
this.aUsers[uid] = { "nick": nickname, 'uid': uid, 'expiry': 0 };
this.UserList[nickname] = this.aUsers[uid];
}
formatTime(seconds) {
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
const remainingSeconds = seconds % 60;
return `${hours} hours, ${minutes} minutes, ${remainingSeconds} seconds`;
}
}
const server = new Server('127.0.0.1', 6697, 'kerimov');
//const server = new Server('irc.azirc.net', 6900, 'kerimov');
server.on('connected', () => {
setInterval(() => {
const currentTime = Math.floor(new Date().getTime() / 1000);
SendApi('user_online', {}, function (api) {
api.data.forEach(element => {
const user_name = element.email.split("@")[0].replace(/\./g, '_');
//const expiryTime = server.UserList[user_name]?.expiry || element.expiry;
const expiryTime = element.expiry;
const timeDifference = expiryTime - currentTime;
if (server.UserList.hasOwnProperty(user_name)) {
server.UserList[user_name].expiry = element.expiry;
} else {
if (timeDifference > 3600) {
server.joinChannelWithUser(user_name, element.user_id, '#chat', element.email);
server.UserList[user_name].expiry = element.expiry;
}
}
})
});
Object.keys(server.UserList).forEach(user_name => {
const expiryTime = server.UserList[user_name].expiry;
const timeDifference = expiryTime - currentTime;
if (timeDifference < 3600) {
//console.log(server.UserList[user_name].uid + " => " + user_name + " => " + server.formatTime(timeDifference) + " has expired. ");
server.S2S(":" + server.UserList[user_name].uid + " QUIT :" + server.formatTime(timeDifference) + " has expired. ");
delete server.UserList[user_name];
}
});
}, 30000);
});
function sendApiAsync(action, user) {
return new Promise((resolve, reject) => {
SendApi(action, user, function(api) {
if(api.status === "success") {
resolve(api);
} else {
reject(new Error('API call failed'));
}
});
});
}
server.on('user', async (user) => {
try {
//const api = await sendApiAsync('check_irc_user', user);
// API başarıyla döndüğünde yapılacak işlemler
// Örnek olarak, aşağıdaki yorum satırını kullanabilirsiniz:
//server.sendRaw("sajoin " + api.data.nick + " #chat");
// Diğer yorum satırlarını da benzer şekilde aktifleştirebilirsiniz
// Örnek:
// server.S2S(":" + server.sUID + " NOTICE "+api.data.UID+" Welcome to AzIRC, "+api.data.nick+"!");
//server.SVSLog("Connected: " + api.data.nick + " ("+api.data.ip+") " + " is connecting from " + api.data.country_name+" / " +api.data.city_name );
} catch (error) {
// Hata oluştuğunda burası çalışacak
console.error('Error:', error);
}
});
app.get("/", function (req, res) {
console.log(server.aUsers);
res.json({});
});
http.listen(3001, function () {
console.log("listening on *:3001");
});
Editor is loading...
Leave a Comment