Skip to content
This repository has been archived by the owner on Mar 21, 2023. It is now read-only.

Commit

Permalink
feat: add basic lua intergration (#20)
Browse files Browse the repository at this point in the history
  • Loading branch information
teaishealthy authored Nov 28, 2022
1 parent 37b5de6 commit 4a8323d
Show file tree
Hide file tree
Showing 17 changed files with 1,051 additions and 56 deletions.
2 changes: 1 addition & 1 deletion android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
compileSdkVersion flutter.compileSdkVersion
compileSdkVersion 33
ndkVersion flutter.ndkVersion

compileOptions {
Expand Down
2 changes: 2 additions & 0 deletions android/app/src/debug/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,7 @@
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
2 changes: 2 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.eludris">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:label="eludris"
android:name="${applicationName}"
Expand Down
27 changes: 27 additions & 0 deletions lib/common.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:yaru/yaru.dart';

Future<void> requestFilePermissions() async {
if (Platform.isAndroid) {
final status = await Permission.storage.request();
if (status.isGranted) {
return;
}
}
}

class DefaultYaru extends StatelessWidget {
final Widget child;
const DefaultYaru(this.child, {super.key});

@override
Widget build(BuildContext context) {
return YaruTheme(
data: const YaruThemeData(variant: YaruVariant.purple),
child: child,
);
}
}
97 changes: 97 additions & 0 deletions lib/lua/api.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import 'dart:convert';

import 'package:eludris/lua/manager.dart';
import 'package:eludris/models/gateway/message.dart';
import 'package:lua_dardo/lua.dart';
import 'package:http/http.dart' show post;

class LuaAPI {
final API api;
bool rejected = false;
final MessageData? message;

LuaAPI(this.api, {this.message});

static const Map<String, DartFunction> _registry = {};
static const Map<String, DartFunction> _apiMember = {
"sendMessage": _sendMessage,
"rejectMessage": _rejectMessage,
"updateMessage": _updateMessage,
};

static LuaAPI _getThis(LuaState ls) => ls.toUserdata<LuaAPI>(1)!.data;

static int _openAPILib(LuaState ls) {
ls.newMetatable("APIClass");
ls.pushValue(-1);
ls.setField(-2, "__index");
ls.setFuncs(_apiMember, 0);

ls.newLib(_registry);
return 1;
}

static int _updateMessage(LuaState ls) {
final api = _getThis(ls);
final String content = ls.checkString(2)!;
final String author = ls.checkString(3)!;
if (api.message != null) {
api.api.updateMessage(api.message!, content: content, author: author);
}

return 0;
}

static int _rejectMessage(LuaState ls) {
_getThis(ls).rejected = true;
return 0;
}

static int _sendMessage(LuaState ls) {
LuaAPI luaAPI = _getThis(ls);
String content = ls.checkString(2)!;
String author = ls.checkString(3)!;

luaAPI.api.sendMessage(content, author);
return 0;
}

static void require(LuaState ls) {
ls.requireF("API", _openAPILib, true);
ls.pop(1);
}
}

class API {
final PluginInfo plugin;
final List<MessageData> messages = [];
final String http;

API({required this.http, required this.plugin});

void sendMessage(String content, String author) async {
if (!plugin.manifest.permissions.contains("SEND_MESSAGES")) {
throw Exception("Plugin does not have permission to send messages");
}
messages
.add(MessageData(author, content, true, plugin: plugin.manifest.name));

await post(Uri.parse("$http/messages"),
body: jsonEncode({"content": content, "author": author}),
headers: {
"Content-Type": "application/json",
});
}

void updateMessage(MessageData message, {String? content, String? author}) {
if (!plugin.manifest.permissions.contains("MODIFY_MESSAGES")) {
throw Exception("Plugin does not have permission to modify messages");
}
if (content != null) {
message.content = content;
}
if (author != null) {
message.author = author;
}
}
}
27 changes: 27 additions & 0 deletions lib/lua/common.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'package:eludris/lua/api.dart';
import 'package:eludris/lua/message.dart';
import 'package:eludris/models/gateway/message.dart';
import 'package:lua_dardo/lua.dart';

void pushToLua<T>(LuaState ls, String varName, String className, T object) {
Userdata u = ls.newUserdata<T>();
u.data = object;
ls.getMetatableAux("${className}Class");
ls.setMetatable(-2);
ls.setGlobal(varName);
}

LuaState prepareLua([LuaAPI? api, MessageData? message]) {
final ls = LuaState.newState();
ls.openLibs();

if (api != null) {
LuaAPI.require(ls);
pushToLua<LuaAPI>(ls, "api", "API", api);
}

if (message != null) {
pushMessageToLua(ls, message);
}
return ls;
}
Loading

0 comments on commit 4a8323d

Please sign in to comment.