mirror of
https://github.com/Shabinder/SpotiFlyer.git
synced 2024-11-26 02:24:31 +01:00
Maintenance Tasks Added
This commit is contained in:
parent
6fbd933b8f
commit
62e110b8c6
@ -0,0 +1,18 @@
|
|||||||
|
@file:Suppress("FunctionName")
|
||||||
|
|
||||||
|
package analytics_html_img
|
||||||
|
|
||||||
|
import utils.byProperty
|
||||||
|
|
||||||
|
internal object Common {
|
||||||
|
const val GITHUB_API = "https://api.github.com"
|
||||||
|
val GITHUB_TOKEN get() = "GITHUB_TOKEN".byProperty
|
||||||
|
fun START_SECTION(tagName: String = "HTI") = "<!--START_SECTION:$tagName-->"
|
||||||
|
fun END_SECTION(tagName: String = "HTI") = "<!--END_SECTION:$tagName-->"
|
||||||
|
const val USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:88.0) Gecko/20100101 Firefox/88.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
internal data class GithubFileContent(
|
||||||
|
val decryptedContent: String,
|
||||||
|
val sha: String
|
||||||
|
)
|
@ -0,0 +1,88 @@
|
|||||||
|
package analytics_html_img
|
||||||
|
|
||||||
|
import io.ktor.client.HttpClient
|
||||||
|
import io.ktor.client.features.json.JsonFeature
|
||||||
|
import io.ktor.client.features.json.serializer.KotlinxSerializer
|
||||||
|
import io.ktor.client.request.get
|
||||||
|
import io.ktor.client.request.header
|
||||||
|
import io.ktor.client.request.headers
|
||||||
|
import io.ktor.client.request.put
|
||||||
|
import io.ktor.http.ContentType
|
||||||
|
import io.ktor.http.contentType
|
||||||
|
import io.ktor.util.InternalAPI
|
||||||
|
import io.ktor.util.encodeBase64
|
||||||
|
import kotlinx.serialization.json.Json
|
||||||
|
import kotlinx.serialization.json.JsonObject
|
||||||
|
import kotlinx.serialization.json.buildJsonObject
|
||||||
|
import kotlinx.serialization.json.jsonPrimitive
|
||||||
|
import kotlinx.serialization.json.put
|
||||||
|
|
||||||
|
internal val client = HttpClient {
|
||||||
|
install(JsonFeature) {
|
||||||
|
serializer = KotlinxSerializer(
|
||||||
|
Json {
|
||||||
|
ignoreUnknownKeys = true
|
||||||
|
isLenient = true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal object GithubService {
|
||||||
|
private const val baseURL = Common.GITHUB_API
|
||||||
|
|
||||||
|
suspend fun getGithubFileContent(
|
||||||
|
token: String,
|
||||||
|
ownerName: String,
|
||||||
|
repoName: String,
|
||||||
|
branchName: String,
|
||||||
|
fileName: String,
|
||||||
|
): GithubFileContent {
|
||||||
|
val resp = client.get<JsonObject>("$baseURL/repos/$ownerName/$repoName/contents/$fileName?ref=$branchName") {
|
||||||
|
headers {
|
||||||
|
header("Authorization", "token $token")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Get Raw Readme File
|
||||||
|
val decodedString = client.get<String>("https://raw.githubusercontent.com/$ownerName/$repoName/$branchName/$fileName") {
|
||||||
|
headers {
|
||||||
|
header("Authorization", "token $token")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return GithubFileContent(
|
||||||
|
decryptedContent = decodedString,
|
||||||
|
sha = resp["sha"]?.jsonPrimitive.toString()
|
||||||
|
.removeSurrounding("\"")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(InternalAPI::class)
|
||||||
|
suspend fun updateGithubFileContent(
|
||||||
|
token: String,
|
||||||
|
ownerName: String,
|
||||||
|
repoName: String,
|
||||||
|
branchName: String,
|
||||||
|
fileName: String,
|
||||||
|
commitMessage: String,
|
||||||
|
rawContent: String,
|
||||||
|
sha: String
|
||||||
|
): JsonObject {
|
||||||
|
return client.put<JsonObject>("$baseURL/repos/$ownerName/$repoName/contents/$fileName") {
|
||||||
|
body = buildJsonObject {
|
||||||
|
put("branch", branchName)
|
||||||
|
put("message", commitMessage)
|
||||||
|
put("content", rawContent.encodeBase64())
|
||||||
|
put("sha", sha)
|
||||||
|
/*put("committer", buildJsonObject {
|
||||||
|
put("name","Shabinder Singh")
|
||||||
|
put("email","dev.shabinder@gmail.com")
|
||||||
|
})*/
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
header("Authorization", "token $token")
|
||||||
|
contentType(ContentType.Application.Json)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,88 @@
|
|||||||
|
package analytics_html_img
|
||||||
|
|
||||||
|
import io.ktor.client.request.header
|
||||||
|
import io.ktor.client.request.headers
|
||||||
|
import io.ktor.client.request.post
|
||||||
|
import io.ktor.http.ContentType
|
||||||
|
import io.ktor.http.contentType
|
||||||
|
import io.ktor.http.userAgent
|
||||||
|
import kotlinx.serialization.json.JsonObject
|
||||||
|
import kotlinx.serialization.json.buildJsonObject
|
||||||
|
import kotlinx.serialization.json.jsonPrimitive
|
||||||
|
import kotlinx.serialization.json.put
|
||||||
|
import utils.HCTI_URL_RESPONSE_ERROR
|
||||||
|
|
||||||
|
internal object HCTIService {
|
||||||
|
|
||||||
|
private const val baseURL = "https://htmlcsstoimage.com/demo_run"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* - When Using Either Viewport Width/Height(in Pixels) , Both are required
|
||||||
|
* */
|
||||||
|
suspend fun getImageURLFromHtml(
|
||||||
|
html: String,
|
||||||
|
css: String = "",
|
||||||
|
delayInMilliSeconds: Int = 250,
|
||||||
|
viewPortHeight: String = "",
|
||||||
|
viewPortWidth: String = "",
|
||||||
|
deviceScale: Int = 2
|
||||||
|
) = getImageURL(
|
||||||
|
mode = "html",
|
||||||
|
data = html,
|
||||||
|
css = css,
|
||||||
|
delayInMilliSeconds = delayInMilliSeconds,
|
||||||
|
viewPortHeight = viewPortHeight,
|
||||||
|
viewPortWidth = viewPortWidth,
|
||||||
|
deviceScale = deviceScale
|
||||||
|
)
|
||||||
|
|
||||||
|
suspend fun getImageURLFromURL(
|
||||||
|
url: String,
|
||||||
|
delayInMilliSeconds: Int = 250,
|
||||||
|
viewPortHeight: String = "",
|
||||||
|
viewPortWidth: String = "",
|
||||||
|
deviceScale: Int = 2
|
||||||
|
) = getImageURL(
|
||||||
|
mode = "url",
|
||||||
|
data = url,
|
||||||
|
delayInMilliSeconds = delayInMilliSeconds,
|
||||||
|
viewPortHeight = viewPortHeight,
|
||||||
|
viewPortWidth = viewPortWidth,
|
||||||
|
deviceScale = deviceScale
|
||||||
|
)
|
||||||
|
|
||||||
|
private suspend fun getImageURL(
|
||||||
|
mode: String, // html/url
|
||||||
|
data: String,
|
||||||
|
css: String = "",
|
||||||
|
viewPortHeight: String = "",
|
||||||
|
viewPortWidth: String = "",
|
||||||
|
delayInMilliSeconds: Int = 250,
|
||||||
|
deviceScale: Int = 2,
|
||||||
|
): String {
|
||||||
|
val resp = client.post<JsonObject>(baseURL) {
|
||||||
|
body = buildJsonObject {
|
||||||
|
put(mode, data)
|
||||||
|
put("console_mode", "")
|
||||||
|
put("css", css)
|
||||||
|
put("selector", "")
|
||||||
|
put("ms_delay", "$delayInMilliSeconds")
|
||||||
|
put("render_when_ready", "")
|
||||||
|
put("viewport_width", viewPortWidth)
|
||||||
|
put("viewport_height", viewPortHeight)
|
||||||
|
put("google_fonts", "")
|
||||||
|
put("device_scale", "$deviceScale")
|
||||||
|
}
|
||||||
|
headers {
|
||||||
|
contentType(ContentType.Application.Json)
|
||||||
|
userAgent(Common.USER_AGENT)
|
||||||
|
header("Referer", "https://htmlcsstoimage.com/demo")
|
||||||
|
header("Origin", "https://htmlcsstoimage.com")
|
||||||
|
header("Host", "htmlcsstoimage.com")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val url = resp["url"] ?: throw HCTI_URL_RESPONSE_ERROR(response = resp.toString())
|
||||||
|
// bubble-up exceptions
|
||||||
|
return url.jsonPrimitive.toString().removeSurrounding("\"")
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package analytics_html_img
|
||||||
|
|
||||||
|
import utils.byOptionalProperty
|
||||||
|
import utils.byProperty
|
||||||
|
|
||||||
|
internal data class Secrets(
|
||||||
|
val githubToken: String,
|
||||||
|
val ownerName: String,
|
||||||
|
val repoName: String,
|
||||||
|
val branchName: String,
|
||||||
|
val filePath: String,
|
||||||
|
val imageDescription: String,
|
||||||
|
val commitMessage: String,
|
||||||
|
val tagName: String
|
||||||
|
)
|
||||||
|
|
||||||
|
internal fun initSecrets() = Secrets(
|
||||||
|
githubToken = "GH_TOKEN".byProperty,
|
||||||
|
ownerName = "OWNER_NAME".byProperty,
|
||||||
|
repoName = "REPO_NAME".byProperty,
|
||||||
|
branchName = "BRANCH_NAME".byOptionalProperty ?: "main",
|
||||||
|
filePath = "FILE_PATH".byOptionalProperty ?: "README.md",
|
||||||
|
imageDescription = "IMAGE_DESCRIPTION".byOptionalProperty ?: "IMAGE",
|
||||||
|
commitMessage = "COMMIT_MESSAGE".byOptionalProperty ?: "HTML-TO-IMAGE Update",
|
||||||
|
tagName = "TAG_NAME".byOptionalProperty ?: "HTI"
|
||||||
|
// hctiKey = "HCTI_KEY".analytics_html_img.getByProperty
|
||||||
|
)
|
@ -0,0 +1,58 @@
|
|||||||
|
package analytics_html_img
|
||||||
|
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
|
import utils.debug
|
||||||
|
|
||||||
|
internal fun updateAnalyticsImage() {
|
||||||
|
val secrets = initSecrets()
|
||||||
|
// debug("fun main: secrets -> $secrets")
|
||||||
|
|
||||||
|
runBlocking {
|
||||||
|
val oldGithubFile = GithubService.getGithubFileContent(
|
||||||
|
token = Common.GITHUB_TOKEN,
|
||||||
|
ownerName = secrets.ownerName,
|
||||||
|
repoName = secrets.repoName,
|
||||||
|
branchName = secrets.branchName,
|
||||||
|
fileName = "README.md"
|
||||||
|
)
|
||||||
|
debug("OLD FILE CONTENT:\n$oldGithubFile")
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use Any Random useless query param ,
|
||||||
|
* As HCTI Demo, `caches value for a specific Link`
|
||||||
|
* */
|
||||||
|
val randomID = (1..100000).random()
|
||||||
|
val imageURL = HCTIService.getImageURLFromURL(
|
||||||
|
url = "https://kind-grasshopper-73.telebit.io/matomo/index.php?module=Widgetize&action=iframe&containerId=VisitOverviewWithGraph&disableLink=0&widget=1&moduleToWidgetize=CoreHome&actionToWidgetize=renderWidgetContainer&idSite=1&period=week&date=today&disableLink=1&widget=$randomID",
|
||||||
|
delayInMilliSeconds = 5000
|
||||||
|
)
|
||||||
|
debug("Updated IMAGE:\n$imageURL")
|
||||||
|
|
||||||
|
val replacementText = """
|
||||||
|
${Common.START_SECTION(secrets.tagName)}
|
||||||
|
![Today's Analytics]($imageURL)
|
||||||
|
${Common.END_SECTION(secrets.tagName)}
|
||||||
|
""".trimIndent()
|
||||||
|
// debug("Updated Text to be Inserted:\n$replacementText")
|
||||||
|
|
||||||
|
val regex = """${Common.START_SECTION(secrets.tagName)}(?s)(.*)${Common.END_SECTION(secrets.tagName)}""".toRegex()
|
||||||
|
val updatedContent = regex.replace(
|
||||||
|
oldGithubFile.decryptedContent,
|
||||||
|
replacementText
|
||||||
|
)
|
||||||
|
// debug("Updated File Content:\n$updatedContent")
|
||||||
|
|
||||||
|
val updationResponse = GithubService.updateGithubFileContent(
|
||||||
|
token = Common.GITHUB_TOKEN,
|
||||||
|
ownerName = secrets.ownerName,
|
||||||
|
repoName = secrets.repoName,
|
||||||
|
branchName = secrets.branchName,
|
||||||
|
fileName = secrets.filePath,
|
||||||
|
commitMessage = secrets.commitMessage,
|
||||||
|
rawContent = updatedContent,
|
||||||
|
sha = oldGithubFile.sha
|
||||||
|
)
|
||||||
|
|
||||||
|
debug("File Updation Response:\n$updationResponse")
|
||||||
|
}
|
||||||
|
}
|
9
maintenance-tasks/src/main/kotlin/main.kt
Normal file
9
maintenance-tasks/src/main/kotlin/main.kt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import analytics_html_img.updateAnalyticsImage
|
||||||
|
import utils.debug
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
debug("fun main: args -> ${args.joinToString(";")}")
|
||||||
|
|
||||||
|
// Update Analytics Image in Readme
|
||||||
|
updateAnalyticsImage()
|
||||||
|
}
|
12
maintenance-tasks/src/main/kotlin/utils/Exceptions.kt
Normal file
12
maintenance-tasks/src/main/kotlin/utils/Exceptions.kt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
@file:Suppress("ClassName")
|
||||||
|
|
||||||
|
package utils
|
||||||
|
|
||||||
|
data class ENV_KEY_MISSING(
|
||||||
|
val keyName: String,
|
||||||
|
override val message: String? = "$keyName was not found, please check your ENV variables"
|
||||||
|
) : Exception(message)
|
||||||
|
data class HCTI_URL_RESPONSE_ERROR(
|
||||||
|
val response: String,
|
||||||
|
override val message: String? = "Server Error, We Recieved this Resp: $response"
|
||||||
|
) : Exception(message)
|
8
maintenance-tasks/src/main/kotlin/utils/Ext.kt
Normal file
8
maintenance-tasks/src/main/kotlin/utils/Ext.kt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
val String.byProperty: String get() = System.getenv(this)
|
||||||
|
?: throw (ENV_KEY_MISSING(this))
|
||||||
|
|
||||||
|
val String.byOptionalProperty: String? get() = System.getenv(this)
|
||||||
|
|
||||||
|
fun debug(message: String) = println("::debug::$message")
|
Loading…
Reference in New Issue
Block a user