<commit_before>package com.mrpowergamerbr.loritta.commands.nashorn

import com.google.common.util.concurrent.ThreadFactoryBuilder
import com.mrpowergamerbr.loritta.commands.AbstractCommand
import com.mrpowergamerbr.loritta.commands.CommandContext
import com.mrpowergamerbr.loritta.nashorn.wrappers.NashornContext
import com.mrpowergamerbr.loritta.parallax.ParallaxUtils
import com.mrpowergamerbr.loritta.parallax.wrappers.ParallaxContext
import com.mrpowergamerbr.loritta.utils.locale.LegacyBaseLocale
import jdk.nashorn.api.scripting.ClassFilter
import net.perfectdreams.loritta.api.commands.CommandCategory
import org.bson.types.ObjectId
import org.graalvm.polyglot.Context
import java.util.*
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit

/**
 * Comandos usando a Nashorn Engine
 */
class NashornCommand : AbstractCommand {
	var id = ObjectId() // Object ID único para cada comando
	var jsLabel = "loritta" // label do comando
	lateinit var javaScript: String // código em JS do comando
	var jsAliases: List<String> = ArrayList() // aliases
	var isEnabled = true // Se o comando está ativado
	// var createdDate = LocalDateTime.now() // Data criada
	// var editedDate = LocalDateTime.now() // Data editada
	var authors: List<String> = ArrayList() // Autores do comando (ou seja, quem mexeu)
	var isPublic = false // Se o comando é público no repositório de comandos
	var isForked = false // Se é uma cópia de outro comando na repo de cmds
	var upstreamId: ObjectId? = null // Caso seja forked, o upstreamId irá ter o Object ID original
	var useNewAPI: Boolean = false
	var description: String? = null

	override val label: String
		get() = jsLabel

	constructor() : super("javascript-command-label", listOf(), CommandCategory.MISC)

	constructor(label: String, javaScript: String) : super(label, listOf(), CommandCategory.MISC) {
		this.jsLabel = label
		this.javaScript = javaScript
		this.aliases = jsAliases
	}

	override suspend fun run(context: CommandContext,locale: LegacyBaseLocale) {
		nashornRun(context, NashornContext(context))
	}

	suspend fun nashornRun(ogContext: CommandContext, context: NashornContext) {
		// Funções que jamais poderão ser usadas em comandos
		val blacklisted = "var quit=function(){throw 'Operação não suportada: quit';};var exit=function(){throw 'Operação não suportada: exit';};var print=function(){throw 'Operação não suportada: print';};var echo=function(){throw 'Operação não suportada: echo';};var readLine=function(){throw 'Operação não suportada: readLine';};var readFully=function(){throw 'Operação não suportada: readFully';};var load=function(){throw 'Operação não suportada: load';};var loadWithNewGlobal=function(){throw 'Operação não suportada: loadWithNewGlobal';};"

		val graalContext = Context.newBuilder()
				.hostClassFilter {
					it.startsWith("com.mrpowergamerbr.loritta.parallax.wrappers")
				}
				.allowHostAccess(true) // Permite usar coisas da JVM dentro do GraalJS
				.option("js.nashorn-compat", "true")
				.build()

		if (!useNewAPI) {
			// Funções inline para facilitar a programação de comandos<commit_msg>Corrigir filter de classes do GraalJS<commit_after>package com.mrpowergamerbr.loritta.commands.nashorn

import com.google.common.util.concurrent.ThreadFactoryBuilder
import com.mrpowergamerbr.loritta.commands.AbstractCommand
import com.mrpowergamerbr.loritta.commands.CommandContext
import com.mrpowergamerbr.loritta.nashorn.wrappers.NashornContext
import com.mrpowergamerbr.loritta.parallax.ParallaxUtils
import com.mrpowergamerbr.loritta.parallax.wrappers.ParallaxContext
import com.mrpowergamerbr.loritta.utils.locale.LegacyBaseLocale
import jdk.nashorn.api.scripting.ClassFilter
import net.perfectdreams.loritta.api.commands.CommandCategory
import org.bson.types.ObjectId
import org.graalvm.polyglot.Context
import java.util.*
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit

/**
 * Comandos usando a Nashorn Engine
 */
class NashornCommand : AbstractCommand {
	var id = ObjectId() // Object ID único para cada comando
	var jsLabel = "loritta" // label do comando
	lateinit var javaScript: String // código em JS do comando
	var jsAliases: List<String> = ArrayList() // aliases
	var isEnabled = true // Se o comando está ativado
	// var createdDate = LocalDateTime.now() // Data criada
	// var editedDate = LocalDateTime.now() // Data editada
	var authors: List<String> = ArrayList() // Autores do comando (ou seja, quem mexeu)
	var isPublic = false // Se o comando é público no repositório de comandos
	var isForked = false // Se é uma cópia de outro comando na repo de cmds
	var upstreamId: ObjectId? = null // Caso seja forked, o upstreamId irá ter o Object ID original
	var useNewAPI: Boolean = false
	var description: String? = null

	override val label: String
		get() = jsLabel

	constructor() : super("javascript-command-label", listOf(), CommandCategory.MISC)

	constructor(label: String, javaScript: String) : super(label, listOf(), CommandCategory.MISC) {
		this.jsLabel = label
		this.javaScript = javaScript
		this.aliases = jsAliases
	}

	override suspend fun run(context: CommandContext,locale: LegacyBaseLocale) {
		nashornRun(context, NashornContext(context))
	}

	suspend fun nashornRun(ogContext: CommandContext, context: NashornContext) {
		// Funções que jamais poderão ser usadas em comandos
		val blacklisted = "var quit=function(){throw 'Operação não suportada: quit';};var exit=function(){throw 'Operação não suportada: exit';};var print=function(){throw 'Operação não suportada: print';};var echo=function(){throw 'Operação não suportada: echo';};var readLine=function(){throw 'Operação não suportada: readLine';};var readFully=function(){throw 'Operação não suportada: readFully';};var load=function(){throw 'Operação não suportada: load';};var loadWithNewGlobal=function(){throw 'Operação não suportada: loadWithNewGlobal';};"

		val graalContext = Context.newBuilder()
				.hostClassFilter {
					it.startsWith("com.mrpowergamerbr.loritta.parallax.wrappers") || it.startsWith("com.mrpowergamerbr.loritta.commands.nashorn.NashornUtils")
				}
				.allowHostAccess(true) // Permite usar coisas da JVM dentro do GraalJS
				.option("js.nashorn-compat", "true")
				.build()

		if (!useNewAPI) {
			// Funções inline para facilitar a programação de comandos
{'fraction_non_alphanumeric': 0.103399209486166, 'fraction_numerical': 0.0, 'mean_word_length': 5.25098814229249, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5400350', 'n_tokens_mistral': 2044, 'n_tokens_neox': 1960, 'n_words': 525}