diff --git a/.idea/misc.xml b/.idea/misc.xml index 0ad17cb..8978d23 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/README.md b/README.md new file mode 100644 index 0000000..95a7f2b --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Quest Weaver + +Einleitung: ChatGPT zu einen Dungeons and Dragons Dungeon Master gemacht, der anhand der deines Charakters, der in den Einstellungen erstellt wird, eine DnD Session mit dir macht. + +Anforderungen: Eine DnD Session mit seinem Charakter automatisch, ohne dass der User jedes Mal auf neues ChatGPT sein Character sagen muss. + +Umsetzung: Weitere Einstellungen hinzugefügt für den Namen und Geschlecht des Charakters und ein Drop Down für der Klasse. Diese werden ausgelesen und an ChatGPT als „System" Nachricht immer beim Erstellen eines neun Chat gegeben damit ChatGPT diese Informationen immer zu Verfügung hat. Da es System Nachrichten sind kann der User sie auch nicht sehen. Außerdem wurde ChatGPT gesagt das er wie ein Dungeon Master handeln soll und auch dein Charakter leveln soll und man ggf. einen D20 würfeln muss, und je nach Ergebnis bestimmte Aktion erfolgreich oder nicht erfolgreich ausführen zu können. Der Name der App sowohl als auch das Icon wurde entsprechend angepasst. + +Probleme/Lessons learned: Zeitdruck; zu viel angesetzt für die kurze Zeit. Speichern der Sessions war geplant aber leider in dem Zeitumfang nicht umsetzbar. Automatisches Starten der Session anstatt einer Nachricht mit „Starte" zu senden hatte sich als komplizierter herausgestellt als gedacht. Übersetzung von der App vom Englischen ins Deutsche war wegen dem Zeitdruck und teils Hardgecodeten Strings auch nicht möglich. + +Fazit: Besser Einschätzen, Viel Zeitdruck diff --git a/app/build.gradle b/app/build.gradle index dde8da9..281cad6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdk 27 targetSdk 34 versionCode 1 - versionName "1.0" + versionName "69.420" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 45fda6c..a1e8960 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,9 +8,9 @@ android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" - android:icon="@drawable/openai_logomark" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" - android:roundIcon="@drawable/openai_logomark" + android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.ChatGpt" tools:targetApi="31"> diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..b536923 Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/de/fhdw/app_entwicklung/chatgpt/MainFragment.java b/app/src/main/java/de/fhdw/app_entwicklung/chatgpt/MainFragment.java index c8062a1..0734f14 100644 --- a/app/src/main/java/de/fhdw/app_entwicklung/chatgpt/MainFragment.java +++ b/app/src/main/java/de/fhdw/app_entwicklung/chatgpt/MainFragment.java @@ -19,6 +19,7 @@ import de.fhdw.app_entwicklung.chatgpt.model.Author; import de.fhdw.app_entwicklung.chatgpt.model.Chat; import de.fhdw.app_entwicklung.chatgpt.model.Message; +import de.fhdw.app_entwicklung.chatgpt.openai.ChatGpt; import de.fhdw.app_entwicklung.chatgpt.openai.IChatGpt; import de.fhdw.app_entwicklung.chatgpt.openai.MockChatGpt; import de.fhdw.app_entwicklung.chatgpt.speech.LaunchSpeechRecognition; @@ -33,19 +34,21 @@ public class MainFragment extends Fragment { private TextToSpeechTool textToSpeech; private Chat chat; + private boolean first = true; + private final ActivityResultLauncher getTextFromSpeech = registerForActivityResult( new LaunchSpeechRecognition(), query -> { - Message userMessage = new Message(Author.User, query); - chat.addMessage(userMessage); - if (chat.getMessages().size() > 1) { - getTextView().append(CHAT_SEPARATOR); - } - getTextView().append(toString(userMessage)); - scrollToEnd(); + Message userMessage = new Message(Author.User, query); + chat.addMessage(userMessage); + if (chat.getMessages().size() > 1) { + getTextView().append(CHAT_SEPARATOR); + } + getTextView().append(toString(userMessage)); + scrollToEnd(); MainActivity.backgroundExecutorService.execute(() -> { - IChatGpt chatGpt = new MockChatGpt(prefs.getApiToken(), prefs.getModel()); + ChatGpt chatGpt = new ChatGpt(prefs.getApiToken(), prefs.getModel()); String answer = chatGpt.getChatCompletion(chat); Message answerMessage = new Message(Author.Assistant, answer); @@ -77,20 +80,20 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat prefs = new PrefsFacade(requireContext()); textToSpeech = new TextToSpeechTool(requireContext(), prefs.getLocale()); - if (savedInstanceState != null) { chat = savedInstanceState.getParcelable(EXTRA_DATA_CHAT); } else { chat = createNewChat(); } + getAskButton().setOnClickListener(v -> + getTextFromSpeech.launch(new LaunchSpeechRecognition.SpeechRecognitionArgs(prefs.getLocale()))); - getAskButton().setOnClickListener(v -> - getTextFromSpeech.launch(new LaunchSpeechRecognition.SpeechRecognitionArgs(prefs.getLocale()))); getResetButton().setOnClickListener(v -> { chat = createNewChat(); updateTextView(); }); updateTextView(); + getTextView().setText("To start the game press ’Ask’ and then say Start!"); } @Override @@ -135,7 +138,7 @@ private void scrollToEnd() { private Chat createNewChat() { Chat chat = new Chat(); - chat.addMessage(new Message(Author.System, prefs.getSpeakingStyle())); + chat.addMessage(new Message(Author.System,"You are an Dungeon Master for the Game ’Dungeons and Dragons’. You will behave like a Dungeon Master. I Have a "+ prefs.getGender() +" Level 1 " + prefs.getUserClass() + " character named ’"+ prefs.getName()+"’ that is starting a new quest that you are creating. Make Sure that the player can earn Experience and Level up, aswell as that he has to roll on certian actions to see if he succeeded in the action or not.")); return chat; } diff --git a/app/src/main/java/de/fhdw/app_entwicklung/chatgpt/PrefsFacade.java b/app/src/main/java/de/fhdw/app_entwicklung/chatgpt/PrefsFacade.java index e2ad123..cd8da81 100644 --- a/app/src/main/java/de/fhdw/app_entwicklung/chatgpt/PrefsFacade.java +++ b/app/src/main/java/de/fhdw/app_entwicklung/chatgpt/PrefsFacade.java @@ -52,6 +52,15 @@ public String getSpeakingStyle() { throw new RuntimeException("Speaking style not supported: " + style); } } + public String getUserClass() { + return PreferenceManager.getDefaultSharedPreferences(context).getString("UserClass", "None"); + } + public String getName() { + return PreferenceManager.getDefaultSharedPreferences(context).getString("Name", "None"); + } + public String getGender() { + return PreferenceManager.getDefaultSharedPreferences(context).getString("Gender", ""); + } public String getModel() { return PreferenceManager.getDefaultSharedPreferences(context).getString("model_type", "gpt-3.5-turbo"); diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index e6e3bda..06cc799 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -37,9 +37,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/ask" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toStartOf="@id/button_reset" app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@id/button_reset" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/scrollview" />