diff --git a/Jigsaw-app/Jigsaw.xcodeproj/project.pbxproj b/Jigsaw-app/Jigsaw.xcodeproj/project.pbxproj index 66320a9..1c08238 100644 --- a/Jigsaw-app/Jigsaw.xcodeproj/project.pbxproj +++ b/Jigsaw-app/Jigsaw.xcodeproj/project.pbxproj @@ -90,11 +90,12 @@ 00F2197E24CCF9A200B72858 /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00F2197D24CCF9A200B72858 /* ProfileViewController.swift */; }; 00F6302224EE385E00BCAD11 /* AnswerCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00F6302124EE385E00BCAD11 /* AnswerCategory.swift */; }; 4719B2272A3BA54A003BA546 /* DemoChatroomConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4719B2262A3BA54A003BA546 /* DemoChatroomConstants.swift */; }; - 47F344C82A50F3B8007F2403 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 47F344C72A50F3B8007F2403 /* GoogleService-Info.plist */; }; + 4730A4FA2ABA734D004C7CBC /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4730A4F92ABA734D004C7CBC /* GoogleService-Info.plist */; }; + 4764BCEF2AA008FC005DCB63 /* ProfanityConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764BCEE2AA008FC005DCB63 /* ProfanityConstants.swift */; }; C5F14B742979E5B100233909 /* swiftgen.yml in Resources */ = {isa = PBXBuildFile; fileRef = C5F14B732979E5B000233909 /* swiftgen.yml */; }; C5F14B772979EC5300233909 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C5F14B792979EC5300233909 /* Localizable.strings */; }; C5F14B7D2979EE1D00233909 /* Strings+Generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5F14B7C2979EE1D00233909 /* Strings+Generated.swift */; }; - DA734B0F00D68A020EEAEA94 /* Pods_Jigsaw.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7ED00D1B45BFE0836C7D9D1D /* Pods_Jigsaw.framework */; }; + E3E2B4A3F8FD46E959B602BD /* Pods_Jigsaw.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5084B95B72B1BEB39C572C54 /* Pods_Jigsaw.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -147,6 +148,7 @@ 003CD279250EE08100BD082E /* JigsawPiece.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JigsawPiece.swift; sourceTree = ""; }; 003CD27B250EEC0D00BD082E /* AgeGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgeGroup.swift; sourceTree = ""; }; 003CD27D250EF96B00BD082E /* CaseReverseInit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaseReverseInit.swift; sourceTree = ""; }; + 003D49B934E331EA5742C3FB /* Pods-Jigsaw.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jigsaw.debug.xcconfig"; path = "Target Support Files/Pods-Jigsaw/Pods-Jigsaw.debug.xcconfig"; sourceTree = ""; }; 0047630324ED10FE007767A5 /* QuestionEssentialProperty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestionEssentialProperty.swift; sourceTree = ""; }; 0047630524ED1154007767A5 /* GameCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameCategory.swift; sourceTree = ""; }; 004A4B0C24FDB55A000FA2C8 /* FormViewController+insetGrouped.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FormViewController+insetGrouped.swift"; sourceTree = ""; }; @@ -222,11 +224,11 @@ 00F2197B24CCF99800B72858 /* MetricsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetricsViewController.swift; sourceTree = ""; }; 00F2197D24CCF9A200B72858 /* ProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewController.swift; sourceTree = ""; }; 00F6302124EE385E00BCAD11 /* AnswerCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnswerCategory.swift; sourceTree = ""; }; - 044B283A6D040597BC329B5A /* Pods-Jigsaw.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jigsaw.release.xcconfig"; path = "Target Support Files/Pods-Jigsaw/Pods-Jigsaw.release.xcconfig"; sourceTree = ""; }; + 04FC35282C1317ACA4FE6254 /* Pods-Jigsaw.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jigsaw.release.xcconfig"; path = "Target Support Files/Pods-Jigsaw/Pods-Jigsaw.release.xcconfig"; sourceTree = ""; }; 4719B2262A3BA54A003BA546 /* DemoChatroomConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoChatroomConstants.swift; sourceTree = ""; }; - 47F344C72A50F3B8007F2403 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 7C60FC56ECF08CB437306FA8 /* Pods-Jigsaw.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jigsaw.debug.xcconfig"; path = "Target Support Files/Pods-Jigsaw/Pods-Jigsaw.debug.xcconfig"; sourceTree = ""; }; - 7ED00D1B45BFE0836C7D9D1D /* Pods_Jigsaw.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Jigsaw.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4730A4F92ABA734D004C7CBC /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 4764BCEE2AA008FC005DCB63 /* ProfanityConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfanityConstants.swift; sourceTree = ""; }; + 5084B95B72B1BEB39C572C54 /* Pods_Jigsaw.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Jigsaw.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C5F14B732979E5B000233909 /* swiftgen.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.yaml; path = swiftgen.yml; sourceTree = SOURCE_ROOT; }; C5F14B782979EC5300233909 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; C5F14B7C2979EE1D00233909 /* Strings+Generated.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Strings+Generated.swift"; sourceTree = ""; }; @@ -239,7 +241,7 @@ files = ( 00A88312252924CF00186BED /* GameKit.framework in Frameworks */, 0055B0C42741E63000041454 /* ResearchKit.framework in Frameworks */, - DA734B0F00D68A020EEAEA94 /* Pods_Jigsaw.framework in Frameworks */, + E3E2B4A3F8FD46E959B602BD /* Pods_Jigsaw.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -352,6 +354,7 @@ 005856BF24D924970010BE55 /* Message.swift */, 005856C324D92CFB0010BE55 /* Chatroom.swift */, 005856CD24D92FB60010BE55 /* ChatUser.swift */, + 4764BCEE2AA008FC005DCB63 /* ProfanityConstants.swift */, ); path = Chatroom; sourceTree = ""; @@ -393,7 +396,7 @@ 0070DFEB24B0060400E71F46 /* SceneDelegate.swift */, C5F14B732979E5B000233909 /* swiftgen.yml */, C5F14B792979EC5300233909 /* Localizable.strings */, - 47F344C72A50F3B8007F2403 /* GoogleService-Info.plist */, + 4730A4F92ABA734D004C7CBC /* GoogleService-Info.plist */, 0070DFF224B0060500E71F46 /* Assets.xcassets */, 0071E921252005780025702E /* Jigsaw.entitlements */, 0070DFF724B0060500E71F46 /* Info.plist */, @@ -555,8 +558,8 @@ 5468D76B6A3E1F4A42D79584 /* Pods */ = { isa = PBXGroup; children = ( - 7C60FC56ECF08CB437306FA8 /* Pods-Jigsaw.debug.xcconfig */, - 044B283A6D040597BC329B5A /* Pods-Jigsaw.release.xcconfig */, + 003D49B934E331EA5742C3FB /* Pods-Jigsaw.debug.xcconfig */, + 04FC35282C1317ACA4FE6254 /* Pods-Jigsaw.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -565,7 +568,7 @@ isa = PBXGroup; children = ( 00A88311252924CF00186BED /* GameKit.framework */, - 7ED00D1B45BFE0836C7D9D1D /* Pods_Jigsaw.framework */, + 5084B95B72B1BEB39C572C54 /* Pods_Jigsaw.framework */, ); name = Frameworks; sourceTree = ""; @@ -585,7 +588,7 @@ isa = PBXNativeTarget; buildConfigurationList = 0070E00524B0060500E71F46 /* Build configuration list for PBXNativeTarget "Jigsaw" */; buildPhases = ( - 49BBF9F517F636F407CEA4FD /* [CP] Check Pods Manifest.lock */, + 64C68EBDDED9B9732DE30E81 /* [CP] Check Pods Manifest.lock */, C5CCF7872979E394007631EC /* Run Script */, 006EB049253BA63E00FE5D8A /* Set Bundle Build Version to date */, 0070DFE224B0060400E71F46 /* Sources */, @@ -593,8 +596,8 @@ 0070DFE424B0060400E71F46 /* Resources */, 0070E00B24B0066B00E71F46 /* SwiftLint */, 005308CC25168A96002A429F /* Embed Frameworks */, - D26F1376B24AEB33E1E411F4 /* [CP] Embed Pods Frameworks */, - 48E12D76666950EF15031028 /* [CP] Copy Pods Resources */, + B3EC30BDB47D88B9BD1C1C99 /* [CP] Embed Pods Frameworks */, + 690421B4996F027D7EDF6F4F /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -698,7 +701,7 @@ 00C89D0C253673BB0078E328 /* github-markdown.css in Resources */, 0070DFF324B0060500E71F46 /* Assets.xcassets in Resources */, 0070DFF124B0060400E71F46 /* Main.storyboard in Resources */, - 47F344C82A50F3B8007F2403 /* GoogleService-Info.plist in Resources */, + 4730A4FA2ABA734D004C7CBC /* GoogleService-Info.plist in Resources */, 00D9F5162506DEDF00898DFA /* PreviewDetailViewController.storyboard in Resources */, 00B0A67A24E3CF9600887701 /* ProfileHeaderView.xib in Resources */, ); @@ -750,24 +753,7 @@ shellPath = /bin/sh; shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nif which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; - 48E12D76666950EF15031028 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Jigsaw/Pods-Jigsaw-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Jigsaw/Pods-Jigsaw-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Jigsaw/Pods-Jigsaw-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 49BBF9F517F636F407CEA4FD /* [CP] Check Pods Manifest.lock */ = { + 64C68EBDDED9B9732DE30E81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -789,25 +775,24 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C5CCF7872979E394007631EC /* Run Script */ = { + 690421B4996F027D7EDF6F4F /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Jigsaw/Pods-Jigsaw-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); - name = "Run Script"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - ); - outputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Jigsaw/Pods-Jigsaw-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [[ -f \"${PODS_ROOT}/SwiftGen/bin/swiftgen\" ]]; then\n \"${PODS_ROOT}/SwiftGen/bin/swiftgen\"\nelse\n echo \"warning: SwiftGen is not installed. Run 'pod install --repo-update' to install it.\"\nfi \n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Jigsaw/Pods-Jigsaw-resources.sh\"\n"; + showEnvVarsInLog = 0; }; - D26F1376B24AEB33E1E411F4 /* [CP] Embed Pods Frameworks */ = { + B3EC30BDB47D88B9BD1C1C99 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -824,6 +809,24 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Jigsaw/Pods-Jigsaw-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + C5CCF7872979E394007631EC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [[ -f \"${PODS_ROOT}/SwiftGen/bin/swiftgen\" ]]; then\n \"${PODS_ROOT}/SwiftGen/bin/swiftgen\"\nelse\n echo \"warning: SwiftGen is not installed. Run 'pod install --repo-update' to install it.\"\nfi \n"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -879,6 +882,7 @@ 003CD27C250EEC0D00BD082E /* AgeGroup.swift in Sources */, 000D809D24ECEDBA0070041D /* EducationLevel.swift in Sources */, 0070DFEA24B0060400E71F46 /* AppDelegate.swift in Sources */, + 4764BCEF2AA008FC005DCB63 /* ProfanityConstants.swift in Sources */, 00E6A86E2533C828000D54B3 /* String+toEmojiImage.swift in Sources */, 00CF5DC524F4DDA500B501BB /* ScaleQuestion.swift in Sources */, 00CDFF1624B44F4C009C789D /* QuestionStepsModel.swift in Sources */, @@ -1071,7 +1075,7 @@ }; 0070E00624B0060500E71F46 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7C60FC56ECF08CB437306FA8 /* Pods-Jigsaw.debug.xcconfig */; + baseConfigurationReference = 003D49B934E331EA5742C3FB /* Pods-Jigsaw.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Jigsaw/Jigsaw.entitlements; @@ -1101,7 +1105,7 @@ }; 0070E00724B0060500E71F46 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 044B283A6D040597BC329B5A /* Pods-Jigsaw.release.xcconfig */; + baseConfigurationReference = 04FC35282C1317ACA4FE6254 /* Pods-Jigsaw.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Jigsaw/Jigsaw.entitlements; diff --git a/Jigsaw-app/Jigsaw/Controllers/Home/ChatViewController.swift b/Jigsaw-app/Jigsaw/Controllers/Home/ChatViewController.swift index 68aab1b..b3acd24 100644 --- a/Jigsaw-app/Jigsaw/Controllers/Home/ChatViewController.swift +++ b/Jigsaw-app/Jigsaw/Controllers/Home/ChatViewController.swift @@ -21,21 +21,6 @@ import InputBarAccessoryView import PINRemoteImage import Agrume -// Profanity Filter - -let botMsg = ["Hi, I'm a bot. How can I assist you?", - "Thank you for contacting us. How can I help you today?", - "I'm here to help. What can I do for you?", - "Please let me know how can I assist you today.", - "Hello! How may I be of assistance?", - "Welcome! I'm here to help. What can I do for you?", - "How can I assist you today? Let me know!", - "Hello there! How may I help you today?", - "Greetings! What can I help you with?", - "Hi, I'm an AI assistant. What do you need help with?", - "Hi there! I'm here to assist you. How can I help?"] -// List of Words taken from : https://www.cs.cmu.edu/~biglou/resources/bad-words.txt -let profaneWordList = ["abbo", "abo", "abortion", "abuse", "addict", "addicts", "adult", "africa", "african", "alla", "allah", "alligatorbait", "amateur", "american", "anal", "analannie", "analsex", "angie", "angry", "anus", "arab", "arabs", "areola", "argie", "aroused", "arse", "arsehole", "asian", "ass", "assassin", "assassinate", "assassination", "assault", "assbagger", "assblaster", "assclown", "asscowboy", "asses", "assfuck", "assfucker", "asshat", "asshole", "assholes", "asshore", "assjockey", "asskiss", "asskisser", "assklown", "asslick", "asslicker", "asslover", "assman", "assmonkey", "assmunch", "assmuncher", "asspacker", "asspirate", "asspuppies", "assranger", "asswhore", "asswipe", "athletesfoot", "attack", "australian", "babe", "babies", "backdoor", "backdoorman", "backseat", "badfuck", "balllicker", "balls", "ballsack", "banging", "baptist", "barelylegal", "barf", "barface", "barfface", "bast", "bastard ", "bazongas", "bazooms", "beaner", "beast", "beastality", "beastial", "beastiality", "beatoff", "beat-off", "beatyourmeat", "beaver", "bestial", "bestiality", "bi", "biatch", "bible", "bicurious", "bigass", "bigbastard", "bigbutt", "bigger", "bisexual", "bi-sexual", "bitch", "bitcher", "bitches", "bitchez", "bitchin", "bitching", "bitchslap", "bitchy", "biteme", "black", "blackman", "blackout", "blacks", "blind", "blow", "blowjob", "boang", "bogan", "bohunk", "bollick", "bollock", "bomb", "bombers", "bombing", "bombs", "bomd", "bondage", "boner", "bong", "boob", "boobies", "boobs", "booby", "boody", "boom", "boong", "boonga", "boonie", "booty", "bootycall", "bountybar", "bra", "brea5t", "breast", "breastjob", "breastlover", "breastman", "brothel", "bugger", "buggered", "buggery", "bullcrap", "bulldike", "bulldyke", "bullshit", "bumblefuck", "bumfuck", "bunga", "bunghole", "buried", "burn", "butchbabes", "butchdike", "butchdyke", "butt", "buttbang", "butt-bang", "buttface", "buttfuck", "butt-fuck", "buttfucker", "butt-fucker", "buttfuckers", "butt-fuckers", "butthead", "buttman", "buttmunch", "buttmuncher", "buttpirate", "buttplug", "buttstain", "byatch", "cacker", "cameljockey", "cameltoe", "canadian", "cancer", "carpetmuncher", "carruth", "catholic", "catholics", "cemetery", "chav", "cherrypopper", "chickslick", "children's", "chin", "chinaman", "chinamen", "chinese", "chink", "chinky", "choad", "chode", "christ", "christian", "church", "cigarette", "cigs", "clamdigger", "clamdiver", "clit", "clitoris", "clogwog", "cocaine", "cock", "cockblock", "cockblocker", "cockcowboy", "cockfight", "cockhead", "cockknob", "cocklicker", "cocklover", "cocknob", "cockqueen", "cockrider", "cocksman", "cocksmith", "cocksmoker", "cocksucer", "cocksuck ", "cocksucked ", "cocksucker", "cocksucking", "cocktail", "cocktease", "cocky", "cohee", "coitus", "color", "colored", "coloured", "commie", "communist", "condom", "conservative", "conspiracy", "coolie", "cooly", "coon", "coondog", "copulate", "cornhole", "corruption", "cra5h", "crabs", "crack", "crackpipe", "crackwhore", "crack-whore", "crap", "crapola", "crapper", "crappy", "crash", "creamy", "crime", "crimes", "criminal", "criminals", "crotch", "crotchjockey", "crotchmonkey", "crotchrot", "cum", "cumbubble", "cumfest", "cumjockey", "cumm", "cummer", "cumming", "cumquat", "cumqueen", "cumshot", "cunilingus", "cunillingus", "cunn", "cunnilingus", "cunntt", "cunt", "cunteyed", "cuntfuck", "cuntfucker", "cuntlick ", "cuntlicker ", "cuntlicking ", "cuntsucker", "cybersex", "cyberslimer", "dago", "dahmer", "dammit", "damn", "damnation", "damnit", "darkie", "darky", "datnigga", "dead", "deapthroat", "death", "deepthroat", "defecate", "dego", "demon", "deposit", "desire", "destroy", "deth", "devil", "devilworshipper", "dick", "dickbrain", "dickforbrains", "dickhead", "dickless", "dicklick", "dicklicker", "dickman", "dickwad", "dickweed", "diddle", "die", "died", "dies", "dike", "dildo", "dingleberry", "dink", "dipshit", "dipstick", "dirty", "disease", "diseases", "disturbed", "dive", "dix", "dixiedike", "dixiedyke", "doggiestyle", "doggystyle", "dong", "doodoo", "doo-doo", "doom", "dope", "dragqueen", "dragqween", "dripdick", "drug", "drunk", "drunken", "dumb", "dumbass", "dumbbitch", "dumbfuck", "dyefly", "dyke", "easyslut", "eatballs", "eatme", "eatpussy", "ecstacy", "ejaculate", "ejaculated", "ejaculating ", "ejaculation", "enema", "enemy", "erect", "erection", "ero", "escort", "ethiopian", "ethnic", "european", "evl", "excrement", "execute", "executed", "execution", "executioner", "explosion", "facefucker", "faeces", "fag", "fagging", "faggot", "fagot", "failed", "failure", "fairies", "fairy", "faith", "fannyfucker", "fart", "farted ", "farting ", "farty ", "fastfuck", "fat", "fatah", "fatass", "fatfuck", "fatfucker", "fatso", "fckcum", "fear", "feces", "felatio ", "felch", "felcher", "felching", "fellatio", "feltch", "feltcher", "feltching", "fetish", "fight", "filipina", "filipino", "fingerfood", "fingerfuck ", "fingerfucked ", "fingerfucker ", "fingerfuckers", "fingerfucking ", "fire", "firing", "fister", "fistfuck", "fistfucked ", "fistfucker ", "fistfucking ", "fisting", "flange", "flasher", "flatulence", "floo", "flydie", "flydye", "fok", "fondle", "footaction", "footfuck", "footfucker", "footlicker", "footstar", "fore", "foreskin", "forni", "fornicate", "foursome", "fourtwenty", "fraud", "freakfuck", "freakyfucker", "freefuck", "fu", "fubar", "fuc", "fucck", "fuck", "fucka", "fuckable", "fuckbag", "fuckbuddy", "fucked", "fuckedup", "fucker", "fuckers", "fuckface", "fuckfest", "fuckfreak", "fuckfriend", "fuckhead", "fuckher", "fuckin", "fuckina", "fucking", "fuckingbitch", "fuckinnuts", "fuckinright", "fuckit", "fuckknob", "fuckme ", "fuckmehard", "fuckmonkey", "fuckoff", "fuckpig", "fucks", "fucktard", "fuckwhore", "fuckyou", "fudgepacker", "fugly", "fuk", "fuks", "funeral", "funfuck", "fungus", "fuuck", "gangbang", "gangbanged ", "gangbanger", "gangsta", "gatorbait", "gay", "gaymuthafuckinwhore", "gaysex ", "geez", "geezer", "geni", "genital", "german", "getiton", "gin", "ginzo", "gipp", "girls", "givehead", "glazeddonut", "gob", "god", "godammit", "goddamit", "goddammit", "goddamn", "goddamned", "goddamnes", "goddamnit", "goddamnmuthafucker", "goldenshower", "gonorrehea", "gonzagas", "gook", "gotohell", "goy", "goyim", "greaseball", "gringo", "groe", "gross", "grostulation", "gubba", "gummer", "gun", "gyp", "gypo", "gypp", "gyppie", "gyppo", "gyppy", "hamas", "handjob", "hapa", "harder", "hardon", "harem", "headfuck", "headlights", "hebe", "heeb", "hell", "henhouse", "heroin", "herpes", "heterosexual", "hijack", "hijacker", "hijacking", "hillbillies", "hindoo", "hiscock", "hitler", "hitlerism", "hitlerist", "hiv", "ho", "hobo", "hodgie", "hoes", "hole", "holestuffer", "homicide", "homo", "homobangers", "homosexual", "honger", "honk", "honkers", "honkey", "honky", "hook", "hooker", "hookers", "hooters", "hore", "hork", "horn", "horney", "horniest", "horny", "horseshit", "hosejob", "hoser", "hostage", "hotdamn", "hotpussy", "hottotrot", "hummer", "husky", "hussy", "hustler", "hymen", "hymie", "iblowu", "idiot", "ikey", "illegal", "incest", "insest", "intercourse", "interracial", "intheass", "inthebuff", "israel", "israeli", "israel's", "italiano", "itch", "jackass", "jackoff", "jackshit", "jacktheripper", "jade", "jap", "japanese", "japcrap", "jebus", "jeez", "jerkoff", "jesus", "jesuschrist", "jew", "jewish", "jiga", "jigaboo", "jigg", "jigga", "jiggabo", "jigger ", "jiggy", "jihad", "jijjiboo", "jimfish", "jism", "jiz ", "jizim", "jizjuice", "jizm ", "jizz", "jizzim", "jizzum", "joint", "juggalo", "jugs", "junglebunny", "kaffer", "kaffir", "kaffre", "kafir", "kanake", "kid", "kigger", "kike", "kill", "killed", "killer", "killing", "kills", "kink", "kinky", "kissass", "kkk", "knife", "knockers", "kock", "kondum", "koon", "kotex", "krap", "krappy", "kraut", "kum", "kumbubble", "kumbullbe", "kummer", "kumming", "kumquat", "kums", "kunilingus", "kunnilingus", "kunt", "ky", "kyke", "lactate", "laid", "lapdance", "latin", "lesbain", "lesbayn", "lesbian", "lesbin", "lesbo", "lez", "lezbe", "lezbefriends", "lezbo", "lezz", "lezzo", "liberal", "libido", "licker", "lickme", "lies", "limey", "limpdick", "limy", "lingerie", "liquor", "livesex", "loadedgun", "lolita", "looser", "loser", "lotion", "lovebone", "lovegoo", "lovegun", "lovejuice", "lovemuscle", "lovepistol", "loverocket", "lowlife", "lsd", "lubejob", "lucifer", "luckycammeltoe", "lugan", "lynch", "macaca", "mad", "mafia", "magicwand", "mams", "manhater", "manpaste", "marijuana", "mastabate", "mastabater", "masterbate", "masterblaster", "mastrabator", "masturbate", "masturbating", "mattressprincess", "meatbeatter", "meatrack", "meth", "mexican", "mgger", "mggor", "mickeyfinn", "mideast", "milf", "minority", "mockey", "mockie", "mocky", "mofo", "moky", "moles", "molest", "molestation", "molester", "molestor", "moneyshot", "mooncricket", "mormon", "moron", "moslem", "mosshead", "mothafuck", "mothafucka", "mothafuckaz", "mothafucked ", "mothafucker", "mothafuckin", "mothafucking ", "mothafuckings", "motherfuck", "motherfucked", "motherfucker", "motherfuckin", "motherfucking", "motherfuckings", "motherlovebone", "muff", "muffdive", "muffdiver", "muffindiver", "mufflikcer", "mulatto", "muncher", "munt", "murder", "murderer", "muslim", "naked", "narcotic", "nasty", "nastybitch", "nastyho", "nastyslut", "nastywhore", "nazi", "necro", "negro", "negroes", "negroid", "negro's", "nig", "niger", "nigerian", "nigerians", "nigg", "nigga", "niggah", "niggaracci", "niggard", "niggarded", "niggarding", "niggardliness", "niggardliness's", "niggardly", "niggards", "niggard's", "niggaz", "nigger", "niggerhead", "niggerhole", "niggers", "nigger's", "niggle", "niggled", "niggles", "niggling", "nigglings", "niggor", "niggur", "niglet", "nignog", "nigr", "nigra", "nigre", "nip", "nipple", "nipplering", "nittit", "nlgger", "nlggor", "nofuckingway", "nook", "nookey", "nookie", "noonan", "nooner", "nude", "nudger", "nuke", "nutfucker", "nymph", "ontherag", "oral", "orga", "orgasim ", "orgasm", "orgies", "orgy", "osama", "paki", "palesimian", "palestinian", "pansies", "pansy", "panti", "panties", "payo", "pearlnecklace", "peck", "pecker", "peckerwood", "pee", "peehole", "pee-pee", "peepshow", "peepshpw", "pendy", "penetration", "peni5", "penile", "penis", "penises", "penthouse", "period", "perv", "phonesex", "phuk", "phuked", "phuking", "phukked", "phukking", "phungky", "phuq", "pi55", "picaninny", "piccaninny", "pickaninny", "piker", "pikey", "piky", "pimp", "pimped", "pimper", "pimpjuic", "pimpjuice", "pimpsimp", "pindick", "piss", "pissed", "pisser", "pisses ", "pisshead", "pissin ", "pissing", "pissoff ", "pistol", "pixie", "pixy", "playboy", "playgirl", "pocha", "pocho", "pocketpool", "pohm", "polack", "pom", "pommie", "pommy", "poo", "poon", "poontang", "poop", "pooper", "pooperscooper", "pooping", "poorwhitetrash", "popimp", "porchmonkey", "porn", "pornflick", "pornking", "porno", "pornography", "pornprincess", "pot", "poverty", "premature", "pric", "prick", "prickhead", "primetime", "propaganda", "pros", "prostitute", "protestant", "pu55i", "pu55y", "pube", "pubic", "pubiclice", "pud", "pudboy", "pudd", "puddboy", "puke", "puntang", "purinapricness", "puss", "pussie", "pussies", "pussy", "pussycat", "pussyeater", "pussyfucker", "pussylicker", "pussylips", "pussylover", "pussypounder", "pusy", "quashie", "queef", "queer", "quickie", "quim", "ra8s", "rabbi", "racial", "racist", "radical", "radicals", "raghead", "randy", "rape", "raped", "raper", "rapist", "rearend", "rearentry", "rectum", "redlight", "redneck", "reefer", "reestie", "refugee", "reject", "remains", "rentafuck", "republican", "rere", "retard", "retarded", "ribbed", "rigger", "rimjob", "rimming", "roach", "robber", "roundeye", "rump", "russki", "russkie", "sadis", "sadom", "samckdaddy", "sandm", "sandnigger", "satan", "scag", "scallywag", "scat", "schlong", "screw", "screwyou", "scrotum", "scum", "semen", "seppo", "servant", "sex", "sexed", "sexfarm", "sexhound", "sexhouse", "sexing", "sexkitten", "sexpot", "sexslave", "sextogo", "sextoy", "sextoys", "sexual", "sexually", "sexwhore", "sexy", "sexymoma", "sexy-slim", "shag", "shaggin", "shagging", "shat", "shav", "shawtypimp", "sheeney", "shhit", "shinola", "shit", "shitcan", "shitdick", "shite", "shiteater", "shited", "shitface", "shitfaced", "shitfit", "shitforbrains", "shitfuck", "shitfucker", "shitfull", "shithapens", "shithappens", "shithead", "shithouse", "shiting", "shitlist", "shitola", "shitoutofluck", "shits", "shitstain", "shitted", "shitter", "shitting", "shitty ", "shoot", "shooting", "shortfuck", "showtime", "sick", "sissy", "sixsixsix", "sixtynine", "sixtyniner", "skank", "skankbitch", "skankfuck", "skankwhore", "skanky", "skankybitch", "skankywhore", "skinflute", "skum", "skumbag", "slant", "slanteye", "slapper", "slaughter", "slav", "slave", "slavedriver", "sleezebag", "sleezeball", "slideitin", "slime", "slimeball", "slimebucket", "slopehead", "slopey", "slopy", "slut", "sluts", "slutt", "slutting", "slutty", "slutwear", "slutwhore", "smack", "smackthemonkey", "smut", "snatch", "snatchpatch", "snigger", "sniggered", "sniggering", "sniggers", "snigger's", "sniper", "snot", "snowback", "snownigger", "sob", "sodom", "sodomise", "sodomite", "sodomize", "sodomy", "sonofabitch", "sonofbitch", "sooty", "sos", "soviet", "spaghettibender", "spaghettinigger", "spank", "spankthemonkey", "sperm", "spermacide", "spermbag", "spermhearder", "spermherder", "spic", "spick", "spig", "spigotty", "spik", "spit", "spitter", "splittail", "spooge", "spreadeagle", "spunk", "spunky", "squaw", "stagg", "stiffy", "strapon", "stringer", "stripclub", "stroke", "stroking", "stupid", "stupidfuck", "stupidfucker", "suck", "suckdick", "sucker", "suckme", "suckmyass", "suckmydick", "suckmytit", "suckoff", "suicide", "swallow", "swallower", "swalow", "swastika", "sweetness", "syphilis", "taboo", "taff", "tampon", "tang", "tantra", "tarbaby", "tard", "teat", "terror", "terrorist", "teste", "testicle", "testicles", "thicklips", "thirdeye", "thirdleg", "threesome", "threeway", "timbernigger", "tinkle", "tit", "titbitnipply", "titfuck", "titfucker", "titfuckin", "titjob", "titlicker", "titlover", "tits", "tittie", "titties", "titty", "tnt", "toilet", "tongethruster", "tongue", "tonguethrust", "tonguetramp", "tortur", "torture", "tosser", "towelhead", "trailertrash", "tramp", "trannie", "tranny", "transexual", "transsexual", "transvestite", "triplex", "trisexual", "trojan", "trots", "tuckahoe", "tunneloflove", "turd", "turnon", "twat", "twink", "twinkie", "twobitwhore", "uck", "uk", "unfuckable", "upskirt", "uptheass", "upthebutt", "urinary", "urinate", "urine", "usama", "uterus", "vagina", "vaginal", "vatican", "vibr", "vibrater", "vibrator", "vietcong", "violence", "virgin", "virginbreaker", "vomit", "vulva", "wab", "wank", "wanker", "wanking", "waysted", "weapon", "weenie", "weewee", "welcher", "welfare", "wetb", "wetback", "wetspot", "whacker", "whash", "whigger", "whiskey", "whiskeydick", "whiskydick", "whit", "whitenigger", "whites", "whitetrash", "whitey", "whiz", "whop", "whore", "whorefucker", "whorehouse", "wigger", "willie", "williewanker", "willy", "wn", "wog", "women's", "wop", "wtf", "wuss", "wuzzie", "xtc", "xxx", "yankee", "yellowman", "zigabo", "zipperhead"] class ChatViewController: MessagesViewController { // MARK: Properties @@ -109,6 +94,25 @@ class ChatViewController: MessagesViewController { super.viewDidDisappear(animated) } + override func viewDidLoad() { + super.viewDidLoad() + + guard let id = chatroom.id else { + navigationController?.popViewController(animated: true) + return + } + + self.setupQuizButton() + self.setupReportActivityButton() + self.chatroomFirestoreSetup(id) + self.messageInputBarSetup() + + messagesCollectionView.messagesDataSource = self + messagesCollectionView.messagesLayoutDelegate = self + messagesCollectionView.messageCellDelegate = self + messagesCollectionView.messagesDisplayDelegate = self + } + @objc func back(sender: UIBarButtonItem) { let confirmationAlert = UIAlertController(title: Strings.ChatViewController.ConfirmationAlert.title, message: Strings.ChatViewController.ConfirmationAlert.message, preferredStyle: .alert) @@ -118,67 +122,49 @@ class ChatViewController: MessagesViewController { self.navigationController?.popViewController(animated: true) })) - confirmationAlert.addAction(UIAlertAction(title: "No", style: .cancel, handler: { (action: UIAlertAction!) in - })) + confirmationAlert.addAction(UIAlertAction(title: "No", style: .cancel)) present(confirmationAlert, animated: true, completion: nil) } - override func viewDidLoad() { - super.viewDidLoad() - - guard let id = chatroom.id else { - navigationController?.popViewController(animated: true) - return + /// Creates and shows the 'Report Activity' button on Chatroom window. + fileprivate func setupReportActivityButton() { + // Prevent the 'Report Activity' button from showing up in Demo Mode + if !isDemo && chatroomUserIDs.count == 2{ + let newReportButton = UIBarButtonItem(title: "Report Activity", style: .plain, target: self, action: #selector(reportButton)) + newReportButton.tintColor = .red + self.navigationItem.rightBarButtonItem = newReportButton } - + } + + /// Responsible for creating and showing the 'Quiz' button on the Chatroom + fileprivate func setupQuizButton() { self.navigationItem.hidesBackButton = true let newBackButton = UIBarButtonItem(title: "Quiz", style: .plain, target: self, action: #selector(ChatViewController.back(sender:))) self.navigationItem.leftBarButtonItem = newBackButton - - messagesReference = FirebaseConstants.chatroomMessagesRef(chatroomID: id) - + } + + /// Responsible for initializing FireStore Chatroom Collection Ref and + /// a listener for real-time updates to the same. + /// - Parameter chatroomID: Chatroom in which changes are being recorded + fileprivate func chatroomFirestoreSetup(_ chatroomID: String) { + messagesReference = FirebaseConstants.chatroomMessagesRef(chatroomID: chatroomID) messageListener = messagesReference?.addSnapshotListener { [weak self] querySnapshot, _ in guard let snapshot = querySnapshot else { return } snapshot.documentChanges.forEach { change in self?.handleDocumentChange(change) } } - + } + + /// Reponsible for setting up the Chat windows' input bar's send button. + fileprivate func messageInputBarSetup() { maintainPositionOnKeyboardFrameChanged = true messageInputBar.sendButton.setTitle("", for: .normal) messageInputBar.inputTextView.placeholder = Strings.ChatViewController.MessageInputBar.InputTextView.placeholder messageInputBar.sendButton.setImage(UIImage(systemName: "paperplane"), for: .normal) messageInputBar.delegate = self - - messagesCollectionView.messagesDataSource = self - messagesCollectionView.messagesLayoutDelegate = self - messagesCollectionView.messageCellDelegate = self - messagesCollectionView.messagesDisplayDelegate = self - /* - let cameraItem = InputBarButtonItem(type: .system) - cameraItem.image = UIImage(systemName: "camera") - cameraItem.addTarget( - self, - action: #selector(cameraButtonPressed), - for: .primaryActionTriggered - ) - cameraItem.setSize(CGSize(width: 60, height: 30), animated: false) - */ - // messageInputBar.leftStackView.alignment = .center - // messageInputBar.setLeftStackViewWidthConstant(to: 50, animated: false) - // messageInputBar.setStackViewItems([cameraItem], forStack: .left, animated: false) - } - - // MARK: - Actions - /* - @objc - private func cameraButtonPressed(_ sender: InputBarButtonItem) { - let picker = UIImagePickerController() - picker.delegate = self - picker.sourceType = .photoLibrary - present(picker, animated: true, completion: nil) - }*/ + } } // MARK: - Helpers @@ -203,6 +189,72 @@ func binarySearch(_ inputArr:Array, _ searchItem: T) -> Int? { } extension ChatViewController { + + /// Report the other user in the chat + /// Works on the assumption that there are only two players in the chat + /// including the current user. + private func reportUser(){ + var userBeingReported: String? = nil + for currentUser in chatroomUserIDs{ + if(currentUser != user.uid && chatroomUserIDs.count == 2){ + // Found the user to be reported + userBeingReported = currentUser + break + } + } + + // Now that we have the user that is going to be reported + // Create a document in the ReportedUsers Collection in Firebase + // for further action + + guard let userBeingReported = userBeingReported else{ + os_log("Some kind of unexpected error occured while trying to fetch the other player's details from the database") + return + } + + let otherPlayerDbRef = FirebaseConstants.players.document(userBeingReported) + + otherPlayerDbRef.getDocument{ document, error in + if let document = document{ + // Got the document for the other player in the chatroom + let data = document.data() + guard let data = data else{ + os_log("Document of the other player \(userBeingReported) contains corrupted data") + return + } + // Create a new entry for the player being reported in the database + FirebaseConstants.reportedPlayers.document(userBeingReported).setData(data) + + let uialertcontroller = UIAlertController(title: "Confirm Report", message: "User successfully reported. Please go to the next page, press cancel and quit the game", preferredStyle: .alert) + uialertcontroller.addAction(UIAlertAction(title: "Got it.", style: .default, handler:{ _ in + self.back(sender: UIBarButtonItem()) + })) + self.present(uialertcontroller, animated: true) + } + } + } + + + + @objc + private func reportButton(){ + let actionController = UIAlertController(title: "Report Activity", message: "", preferredStyle: .actionSheet) + let reportUserAction = UIAlertAction(title: "Report User", style: .destructive){_ in + // Present confirmation alert to the user for the report + self.reportUser() + } + // Once a user presses this button, the collection 'isReported' gets updated in firestore + // and the game exits + let reportChatAction = UIAlertAction(title: "Report Chat", style: .destructive){_ in + // self.confirmReportAlert() + } + let cancelReportAction = UIAlertAction(title: "Cancel", style: .cancel) + actionController.addAction(reportUserAction) + actionController.addAction(reportChatAction) + actionController.addAction(cancelReportAction) + self.present(actionController, animated: true) + } + private func getUserPiece(uid: String) -> JigsawPiece { let piece: JigsawPiece if let currentUserIndex = chatroomUserIDs.firstIndex(of: uid) { @@ -233,7 +285,7 @@ extension ChatViewController { private func didReceiveUserMessage() { let robot = ChatUser(senderId: "robot", displayName: "Robot", jigsawValue: Profiles.jigsawValue) srand48(Int(Date().timeIntervalSince1970)) - let randomNumber = Int(arc4random_uniform(UInt32(botMsg.count))) + // let randomNumber = Int(arc4random_uniform(UInt32(botMsg.count))) DispatchQueue.main.asyncAfter(deadline: .now() + 3) { @@ -253,7 +305,7 @@ extension ChatViewController { self.chatMessages.append(robotMsg) self.chatMessages.sort() - let isLatestMessage2 = self.chatMessages.firstIndex(of: robotMsg) == (self.chatMessages.count - 1) + // let isLatestMessage2 = self.chatMessages.firstIndex(of: robotMsg) == (self.chatMessages.count - 1) self.messagesCollectionView.reloadData() self.messagesCollectionView.scrollToLastItem(animated: true) @@ -275,8 +327,7 @@ extension ChatViewController { } } messageContentStr = String(messageContentStrList.joined(by: " ")) - var newMessage: Message = Message(message: message, content: messageContentStr) - return newMessage + return Message(message: message, content: messageContentStr) } private func insertNewMessage(_ message: Message) { @@ -287,7 +338,7 @@ extension ChatViewController { chatMessages.append(newMessage) chatMessages.sort() - let isLatestMessage = chatMessages.firstIndex(of: message) == (chatMessages.count - 1) + // let isLatestMessage = chatMessages.firstIndex(of: message) == (chatMessages.count - 1) messagesCollectionView.reloadData() @@ -307,48 +358,7 @@ extension ChatViewController { break } } - /* - private func uploadImage(_ image: UIImage, to channel: Chatroom, completion: @escaping (URL?) -> Void) { - guard let channelID = channel.id else { - completion(nil) - return - } - - guard let scaledImage = image.scaledToSafeUploadSize, let data = scaledImage.UIImageJPEGRepresentation(compressionQuality: 0.4) else { - completion(nil) - return - } - - let metadata = StorageMetadata() - metadata.contentType = "image/jpeg" - - let imageName = [UUID().uuidString, String(Date().timeIntervalSince1970)].joined() - let imageRef = FirebaseConstants.chatroomStorage.child(channelID).child(imageName) - imageRef.putData(data, metadata: metadata) { metadata, _ in - guard metadata != nil else { - completion(nil) - return - } - // Async fetch the download URL. - imageRef.downloadURL { url, _ in - completion(url) - } - } - } - - private func sendPhoto(_ image: UIImage) { - isSendingPhoto = true - - uploadImage(image, to: chatroom) { [weak self] url in - guard let self = self, let url = url else { return } - self.isSendingPhoto = false - - let message = Message(user: self.user, imageURL: url) - self.save(message) - self.messagesCollectionView.scrollToBottom() - } - } - */ + private func sendControlMessage(type: ControlMetaMessage) { let message = Message(user: user, controlMetaMessage: type) save(message) @@ -528,6 +538,70 @@ extension ChatViewController: InputBarAccessoryViewDelegate { } } +//extension ChatViewController{ +// +// fileprivate func messageInputBarCameraButtonSetup() { +// let cameraItem = InputBarButtonItem(type: .system) +// cameraItem.image = UIImage(systemName: "camera") +// cameraItem.addTarget( +// self, +// action: #selector(cameraButtonPressed), +// for: .primaryActionTriggered +// ) +// cameraItem.setSize(CGSize(width: 60, height: 30), animated: false) +// } +// +// +// private func uploadImage(_ image: UIImage, to channel: Chatroom, completion: @escaping (URL?) -> Void) { +// guard let channelID = channel.id else { +// completion(nil) +// return +// } +// +// guard let scaledImage = image.scaledToSafeUploadSize, let data = scaledImage.UIImageJPEGRepresentation(compressionQuality: 0.4) else { +// completion(nil) +// return +// } +// +// let metadata = StorageMetadata() +// metadata.contentType = "image/jpeg" +// +// let imageName = [UUID().uuidString, String(Date().timeIntervalSince1970)].joined() +// let imageRef = FirebaseConstants.chatroomStorage.child(channelID).child(imageName) +// imageRef.putData(data, metadata: metadata) { metadata, _ in +// guard metadata != nil else { +// completion(nil) +// return +// } +// // Async fetch the download URL. +// imageRef.downloadURL { url, _ in +// completion(url) +// } +// } +// } +// +// private func sendPhoto(_ image: UIImage) { +// isSendingPhoto = true +// +// uploadImage(image, to: chatroom) { [weak self] url in +// guard let self = self, let url = url else { return } +// self.isSendingPhoto = false +// +// let message = Message(user: self.user, imageURL: url) +// self.save(message) +// self.messagesCollectionView.scrollToLastItem() +// } +// } +// +// @objc +// private func cameraButtonPressed(_ sender: InputBarButtonItem) { +// let picker = UIImagePickerController() +// picker.delegate = self +// picker.sourceType = .photoLibrary +// present(picker, animated: true, completion: nil) +// } +// +//} // MARK: - UIImagePickerControllerDelegate /* extension ChatViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { diff --git a/Jigsaw-app/Jigsaw/Info.plist b/Jigsaw-app/Jigsaw/Info.plist index 07cdfe2..f0911c7 100644 --- a/Jigsaw-app/Jigsaw/Info.plist +++ b/Jigsaw-app/Jigsaw/Info.plist @@ -28,7 +28,7 @@ CFBundleVersion - 20230821 + 20230920 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/Jigsaw-app/Jigsaw/Models/Chatroom/ProfanityConstants.swift b/Jigsaw-app/Jigsaw/Models/Chatroom/ProfanityConstants.swift new file mode 100644 index 0000000..4a238f4 --- /dev/null +++ b/Jigsaw-app/Jigsaw/Models/Chatroom/ProfanityConstants.swift @@ -0,0 +1,13 @@ +// +// ProfanityConstants.swift +// Jigsaw +// +// Created by Suryansh Jain on 8/30/23. +// Copyright © 2023 DukeMobileDevCenter. All rights reserved. +// + +import Foundation + +// Profanity Filter +// List of Words taken from : https://www.cs.cmu.edu/~biglou/resources/bad-words.txt +let profaneWordList = ["abbo", "abo", "abortion", "abuse", "addict", "addicts", "adult", "africa", "african", "alla", "allah", "alligatorbait", "amateur", "american", "anal", "analannie", "analsex", "angie", "angry", "anus", "arab", "arabs", "areola", "argie", "aroused", "arse", "arsehole", "asian", "ass", "assassin", "assassinate", "assassination", "assault", "assbagger", "assblaster", "assclown", "asscowboy", "asses", "assfuck", "assfucker", "asshat", "asshole", "assholes", "asshore", "assjockey", "asskiss", "asskisser", "assklown", "asslick", "asslicker", "asslover", "assman", "assmonkey", "assmunch", "assmuncher", "asspacker", "asspirate", "asspuppies", "assranger", "asswhore", "asswipe", "athletesfoot", "attack", "australian", "babe", "babies", "backdoor", "backdoorman", "backseat", "badfuck", "balllicker", "balls", "ballsack", "banging", "baptist", "barelylegal", "barf", "barface", "barfface", "bast", "bastard ", "bazongas", "bazooms", "beaner", "beast", "beastality", "beastial", "beastiality", "beatoff", "beat-off", "beatyourmeat", "beaver", "bestial", "bestiality", "bi", "biatch", "bible", "bicurious", "bigass", "bigbastard", "bigbutt", "bigger", "bisexual", "bi-sexual", "bitch", "bitcher", "bitches", "bitchez", "bitchin", "bitching", "bitchslap", "bitchy", "biteme", "black", "blackman", "blackout", "blacks", "blind", "blow", "blowjob", "boang", "bogan", "bohunk", "bollick", "bollock", "bomb", "bombers", "bombing", "bombs", "bomd", "bondage", "boner", "bong", "boob", "boobies", "boobs", "booby", "boody", "boom", "boong", "boonga", "boonie", "booty", "bootycall", "bountybar", "bra", "brea5t", "breast", "breastjob", "breastlover", "breastman", "brothel", "bugger", "buggered", "buggery", "bullcrap", "bulldike", "bulldyke", "bullshit", "bumblefuck", "bumfuck", "bunga", "bunghole", "buried", "burn", "butchbabes", "butchdike", "butchdyke", "butt", "buttbang", "butt-bang", "buttface", "buttfuck", "butt-fuck", "buttfucker", "butt-fucker", "buttfuckers", "butt-fuckers", "butthead", "buttman", "buttmunch", "buttmuncher", "buttpirate", "buttplug", "buttstain", "byatch", "cacker", "cameljockey", "cameltoe", "canadian", "cancer", "carpetmuncher", "carruth", "catholic", "catholics", "cemetery", "chav", "cherrypopper", "chickslick", "children's", "chin", "chinaman", "chinamen", "chinese", "chink", "chinky", "choad", "chode", "christ", "christian", "church", "cigarette", "cigs", "clamdigger", "clamdiver", "clit", "clitoris", "clogwog", "cocaine", "cock", "cockblock", "cockblocker", "cockcowboy", "cockfight", "cockhead", "cockknob", "cocklicker", "cocklover", "cocknob", "cockqueen", "cockrider", "cocksman", "cocksmith", "cocksmoker", "cocksucer", "cocksuck ", "cocksucked ", "cocksucker", "cocksucking", "cocktail", "cocktease", "cocky", "cohee", "coitus", "color", "colored", "coloured", "commie", "communist", "condom", "conservative", "conspiracy", "coolie", "cooly", "coon", "coondog", "copulate", "cornhole", "corruption", "cra5h", "crabs", "crack", "crackpipe", "crackwhore", "crack-whore", "crap", "crapola", "crapper", "crappy", "crash", "creamy", "crime", "crimes", "criminal", "criminals", "crotch", "crotchjockey", "crotchmonkey", "crotchrot", "cum", "cumbubble", "cumfest", "cumjockey", "cumm", "cummer", "cumming", "cumquat", "cumqueen", "cumshot", "cunilingus", "cunillingus", "cunn", "cunnilingus", "cunntt", "cunt", "cunteyed", "cuntfuck", "cuntfucker", "cuntlick ", "cuntlicker ", "cuntlicking ", "cuntsucker", "cybersex", "cyberslimer", "dago", "dahmer", "dammit", "damn", "damnation", "damnit", "darkie", "darky", "datnigga", "dead", "deapthroat", "death", "deepthroat", "defecate", "dego", "demon", "deposit", "desire", "destroy", "deth", "devil", "devilworshipper", "dick", "dickbrain", "dickforbrains", "dickhead", "dickless", "dicklick", "dicklicker", "dickman", "dickwad", "dickweed", "diddle", "die", "died", "dies", "dike", "dildo", "dingleberry", "dink", "dipshit", "dipstick", "dirty", "disease", "diseases", "disturbed", "dive", "dix", "dixiedike", "dixiedyke", "doggiestyle", "doggystyle", "dong", "doodoo", "doo-doo", "doom", "dope", "dragqueen", "dragqween", "dripdick", "drug", "drunk", "drunken", "dumb", "dumbass", "dumbbitch", "dumbfuck", "dyefly", "dyke", "easyslut", "eatballs", "eatme", "eatpussy", "ecstacy", "ejaculate", "ejaculated", "ejaculating ", "ejaculation", "enema", "enemy", "erect", "erection", "ero", "escort", "ethiopian", "ethnic", "european", "evl", "excrement", "execute", "executed", "execution", "executioner", "explosion", "facefucker", "faeces", "fag", "fagging", "faggot", "fagot", "failed", "failure", "fairies", "fairy", "faith", "fannyfucker", "fart", "farted ", "farting ", "farty ", "fastfuck", "fat", "fatah", "fatass", "fatfuck", "fatfucker", "fatso", "fckcum", "fear", "feces", "felatio ", "felch", "felcher", "felching", "fellatio", "feltch", "feltcher", "feltching", "fetish", "fight", "filipina", "filipino", "fingerfood", "fingerfuck ", "fingerfucked ", "fingerfucker ", "fingerfuckers", "fingerfucking ", "fire", "firing", "fister", "fistfuck", "fistfucked ", "fistfucker ", "fistfucking ", "fisting", "flange", "flasher", "flatulence", "floo", "flydie", "flydye", "fok", "fondle", "footaction", "footfuck", "footfucker", "footlicker", "footstar", "fore", "foreskin", "forni", "fornicate", "foursome", "fourtwenty", "fraud", "freakfuck", "freakyfucker", "freefuck", "fu", "fubar", "fuc", "fucck", "fuck", "fucka", "fuckable", "fuckbag", "fuckbuddy", "fucked", "fuckedup", "fucker", "fuckers", "fuckface", "fuckfest", "fuckfreak", "fuckfriend", "fuckhead", "fuckher", "fuckin", "fuckina", "fucking", "fuckingbitch", "fuckinnuts", "fuckinright", "fuckit", "fuckknob", "fuckme ", "fuckmehard", "fuckmonkey", "fuckoff", "fuckpig", "fucks", "fucktard", "fuckwhore", "fuckyou", "fudgepacker", "fugly", "fuk", "fuks", "funeral", "funfuck", "fungus", "fuuck", "gangbang", "gangbanged ", "gangbanger", "gangsta", "gatorbait", "gay", "gaymuthafuckinwhore", "gaysex ", "geez", "geezer", "geni", "genital", "german", "getiton", "gin", "ginzo", "gipp", "girls", "givehead", "glazeddonut", "gob", "god", "godammit", "goddamit", "goddammit", "goddamn", "goddamned", "goddamnes", "goddamnit", "goddamnmuthafucker", "goldenshower", "gonorrehea", "gonzagas", "gook", "gotohell", "goy", "goyim", "greaseball", "gringo", "groe", "gross", "grostulation", "gubba", "gummer", "gun", "gyp", "gypo", "gypp", "gyppie", "gyppo", "gyppy", "hamas", "handjob", "hapa", "harder", "hardon", "harem", "headfuck", "headlights", "hebe", "heeb", "hell", "henhouse", "heroin", "herpes", "heterosexual", "hijack", "hijacker", "hijacking", "hillbillies", "hindoo", "hiscock", "hitler", "hitlerism", "hitlerist", "hiv", "ho", "hobo", "hodgie", "hoes", "hole", "holestuffer", "homicide", "homo", "homobangers", "homosexual", "honger", "honk", "honkers", "honkey", "honky", "hook", "hooker", "hookers", "hooters", "hore", "hork", "horn", "horney", "horniest", "horny", "horseshit", "hosejob", "hoser", "hostage", "hotdamn", "hotpussy", "hottotrot", "hummer", "husky", "hussy", "hustler", "hymen", "hymie", "iblowu", "idiot", "ikey", "illegal", "incest", "insest", "intercourse", "interracial", "intheass", "inthebuff", "israel", "israeli", "israel's", "italiano", "itch", "jackass", "jackoff", "jackshit", "jacktheripper", "jade", "jap", "japanese", "japcrap", "jebus", "jeez", "jerkoff", "jesus", "jesuschrist", "jew", "jewish", "jiga", "jigaboo", "jigg", "jigga", "jiggabo", "jigger ", "jiggy", "jihad", "jijjiboo", "jimfish", "jism", "jiz ", "jizim", "jizjuice", "jizm ", "jizz", "jizzim", "jizzum", "joint", "juggalo", "jugs", "junglebunny", "kaffer", "kaffir", "kaffre", "kafir", "kanake", "kid", "kigger", "kike", "kill", "killed", "killer", "killing", "kills", "kink", "kinky", "kissass", "kkk", "knife", "knockers", "kock", "kondum", "koon", "kotex", "krap", "krappy", "kraut", "kum", "kumbubble", "kumbullbe", "kummer", "kumming", "kumquat", "kums", "kunilingus", "kunnilingus", "kunt", "ky", "kyke", "lactate", "laid", "lapdance", "latin", "lesbain", "lesbayn", "lesbian", "lesbin", "lesbo", "lez", "lezbe", "lezbefriends", "lezbo", "lezz", "lezzo", "liberal", "libido", "licker", "lickme", "lies", "limey", "limpdick", "limy", "lingerie", "liquor", "livesex", "loadedgun", "lolita", "looser", "loser", "lotion", "lovebone", "lovegoo", "lovegun", "lovejuice", "lovemuscle", "lovepistol", "loverocket", "lowlife", "lsd", "lubejob", "lucifer", "luckycammeltoe", "lugan", "lynch", "macaca", "mad", "mafia", "magicwand", "mams", "manhater", "manpaste", "marijuana", "mastabate", "mastabater", "masterbate", "masterblaster", "mastrabator", "masturbate", "masturbating", "mattressprincess", "meatbeatter", "meatrack", "meth", "mexican", "mgger", "mggor", "mickeyfinn", "mideast", "milf", "minority", "mockey", "mockie", "mocky", "mofo", "moky", "moles", "molest", "molestation", "molester", "molestor", "moneyshot", "mooncricket", "mormon", "moron", "moslem", "mosshead", "mothafuck", "mothafucka", "mothafuckaz", "mothafucked ", "mothafucker", "mothafuckin", "mothafucking ", "mothafuckings", "motherfuck", "motherfucked", "motherfucker", "motherfuckin", "motherfucking", "motherfuckings", "motherlovebone", "muff", "muffdive", "muffdiver", "muffindiver", "mufflikcer", "mulatto", "muncher", "munt", "murder", "murderer", "muslim", "naked", "narcotic", "nasty", "nastybitch", "nastyho", "nastyslut", "nastywhore", "nazi", "necro", "negro", "negroes", "negroid", "negro's", "nig", "niger", "nigerian", "nigerians", "nigg", "nigga", "niggah", "niggaracci", "niggard", "niggarded", "niggarding", "niggardliness", "niggardliness's", "niggardly", "niggards", "niggard's", "niggaz", "nigger", "niggerhead", "niggerhole", "niggers", "nigger's", "niggle", "niggled", "niggles", "niggling", "nigglings", "niggor", "niggur", "niglet", "nignog", "nigr", "nigra", "nigre", "nip", "nipple", "nipplering", "nittit", "nlgger", "nlggor", "nofuckingway", "nook", "nookey", "nookie", "noonan", "nooner", "nude", "nudger", "nuke", "nutfucker", "nymph", "ontherag", "oral", "orga", "orgasim ", "orgasm", "orgies", "orgy", "osama", "paki", "palesimian", "palestinian", "pansies", "pansy", "panti", "panties", "payo", "pearlnecklace", "peck", "pecker", "peckerwood", "pee", "peehole", "pee-pee", "peepshow", "peepshpw", "pendy", "penetration", "peni5", "penile", "penis", "penises", "penthouse", "period", "perv", "phonesex", "phuk", "phuked", "phuking", "phukked", "phukking", "phungky", "phuq", "pi55", "picaninny", "piccaninny", "pickaninny", "piker", "pikey", "piky", "pimp", "pimped", "pimper", "pimpjuic", "pimpjuice", "pimpsimp", "pindick", "piss", "pissed", "pisser", "pisses ", "pisshead", "pissin ", "pissing", "pissoff ", "pistol", "pixie", "pixy", "playboy", "playgirl", "pocha", "pocho", "pocketpool", "pohm", "polack", "pom", "pommie", "pommy", "poo", "poon", "poontang", "poop", "pooper", "pooperscooper", "pooping", "poorwhitetrash", "popimp", "porchmonkey", "porn", "pornflick", "pornking", "porno", "pornography", "pornprincess", "pot", "poverty", "premature", "pric", "prick", "prickhead", "primetime", "propaganda", "pros", "prostitute", "protestant", "pu55i", "pu55y", "pube", "pubic", "pubiclice", "pud", "pudboy", "pudd", "puddboy", "puke", "puntang", "purinapricness", "puss", "pussie", "pussies", "pussy", "pussycat", "pussyeater", "pussyfucker", "pussylicker", "pussylips", "pussylover", "pussypounder", "pusy", "quashie", "queef", "queer", "quickie", "quim", "ra8s", "rabbi", "racial", "racist", "radical", "radicals", "raghead", "randy", "rape", "raped", "raper", "rapist", "rearend", "rearentry", "rectum", "redlight", "redneck", "reefer", "reestie", "refugee", "reject", "remains", "rentafuck", "republican", "rere", "retard", "retarded", "ribbed", "rigger", "rimjob", "rimming", "roach", "robber", "roundeye", "rump", "russki", "russkie", "sadis", "sadom", "samckdaddy", "sandm", "sandnigger", "satan", "scag", "scallywag", "scat", "schlong", "screw", "screwyou", "scrotum", "scum", "semen", "seppo", "servant", "sex", "sexed", "sexfarm", "sexhound", "sexhouse", "sexing", "sexkitten", "sexpot", "sexslave", "sextogo", "sextoy", "sextoys", "sexual", "sexually", "sexwhore", "sexy", "sexymoma", "sexy-slim", "shag", "shaggin", "shagging", "shat", "shav", "shawtypimp", "sheeney", "shhit", "shinola", "shit", "shitcan", "shitdick", "shite", "shiteater", "shited", "shitface", "shitfaced", "shitfit", "shitforbrains", "shitfuck", "shitfucker", "shitfull", "shithapens", "shithappens", "shithead", "shithouse", "shiting", "shitlist", "shitola", "shitoutofluck", "shits", "shitstain", "shitted", "shitter", "shitting", "shitty ", "shoot", "shooting", "shortfuck", "showtime", "sick", "sissy", "sixsixsix", "sixtynine", "sixtyniner", "skank", "skankbitch", "skankfuck", "skankwhore", "skanky", "skankybitch", "skankywhore", "skinflute", "skum", "skumbag", "slant", "slanteye", "slapper", "slaughter", "slav", "slave", "slavedriver", "sleezebag", "sleezeball", "slideitin", "slime", "slimeball", "slimebucket", "slopehead", "slopey", "slopy", "slut", "sluts", "slutt", "slutting", "slutty", "slutwear", "slutwhore", "smack", "smackthemonkey", "smut", "snatch", "snatchpatch", "snigger", "sniggered", "sniggering", "sniggers", "snigger's", "sniper", "snot", "snowback", "snownigger", "sob", "sodom", "sodomise", "sodomite", "sodomize", "sodomy", "sonofabitch", "sonofbitch", "sooty", "sos", "soviet", "spaghettibender", "spaghettinigger", "spank", "spankthemonkey", "sperm", "spermacide", "spermbag", "spermhearder", "spermherder", "spic", "spick", "spig", "spigotty", "spik", "spit", "spitter", "splittail", "spooge", "spreadeagle", "spunk", "spunky", "squaw", "stagg", "stiffy", "strapon", "stringer", "stripclub", "stroke", "stroking", "stupid", "stupidfuck", "stupidfucker", "suck", "suckdick", "sucker", "suckme", "suckmyass", "suckmydick", "suckmytit", "suckoff", "suicide", "swallow", "swallower", "swalow", "swastika", "sweetness", "syphilis", "taboo", "taff", "tampon", "tang", "tantra", "tarbaby", "tard", "teat", "terror", "terrorist", "teste", "testicle", "testicles", "thicklips", "thirdeye", "thirdleg", "threesome", "threeway", "timbernigger", "tinkle", "tit", "titbitnipply", "titfuck", "titfucker", "titfuckin", "titjob", "titlicker", "titlover", "tits", "tittie", "titties", "titty", "tnt", "toilet", "tongethruster", "tongue", "tonguethrust", "tonguetramp", "tortur", "torture", "tosser", "towelhead", "trailertrash", "tramp", "trannie", "tranny", "transexual", "transsexual", "transvestite", "triplex", "trisexual", "trojan", "trots", "tuckahoe", "tunneloflove", "turd", "turnon", "twat", "twink", "twinkie", "twobitwhore", "uck", "uk", "unfuckable", "upskirt", "uptheass", "upthebutt", "urinary", "urinate", "urine", "usama", "uterus", "vagina", "vaginal", "vatican", "vibr", "vibrater", "vibrator", "vietcong", "violence", "virgin", "virginbreaker", "vomit", "vulva", "wab", "wank", "wanker", "wanking", "waysted", "weapon", "weenie", "weewee", "welcher", "welfare", "wetb", "wetback", "wetspot", "whacker", "whash", "whigger", "whiskey", "whiskeydick", "whiskydick", "whit", "whitenigger", "whites", "whitetrash", "whitey", "whiz", "whop", "whore", "whorefucker", "whorehouse", "wigger", "willie", "williewanker", "willy", "wn", "wog", "women's", "wop", "wtf", "wuss", "wuzzie", "xtc", "xxx", "yankee", "yellowman", "zigabo", "zipperhead"] diff --git a/Jigsaw-app/Jigsaw/Models/FirebaseConstants.swift b/Jigsaw-app/Jigsaw/Models/FirebaseConstants.swift index db73947..351b28c 100644 --- a/Jigsaw-app/Jigsaw/Models/FirebaseConstants.swift +++ b/Jigsaw-app/Jigsaw/Models/FirebaseConstants.swift @@ -22,6 +22,7 @@ enum FirebaseConstants { static let gamegroups = database.collection("GameGroups") /// A reference to the collection of team ranking stats. static let teamRankings = database.collection("TeamRankings") + static let reportedPlayers = database.collection("ReportedPlayers") static let gamesStorage = storage.reference(withPath: "Games") static let chatroomStorage = storage.reference(withPath: "Chatrooms") diff --git a/Jigsaw-app/Jigsaw/Storyboards/Base.lproj/Main.storyboard b/Jigsaw-app/Jigsaw/Storyboards/Base.lproj/Main.storyboard index 81f9d0a..af6ed80 100644 --- a/Jigsaw-app/Jigsaw/Storyboards/Base.lproj/Main.storyboard +++ b/Jigsaw-app/Jigsaw/Storyboards/Base.lproj/Main.storyboard @@ -707,7 +707,7 @@ - + diff --git a/Jigsaw-app/Podfile b/Jigsaw-app/Podfile index 8dd7ce3..4585a9a 100644 --- a/Jigsaw-app/Podfile +++ b/Jigsaw-app/Podfile @@ -56,9 +56,6 @@ target 'Jigsaw' do # Localization pod 'SwiftGen', '~> 6.0' - # Profanity Filter - pod 'AAProfanityFilter' - end # Bump all Pod minimum target to iOS 14, to cope with Xcode 13 diff --git a/Jigsaw-app/Podfile.lock b/Jigsaw-app/Podfile.lock index 665529e..f6515c3 100644 --- a/Jigsaw-app/Podfile.lock +++ b/Jigsaw-app/Podfile.lock @@ -1,5 +1,4 @@ PODS: - - AAProfanityFilter (0.1.0) - abseil/algorithm (0.20200225.0): - abseil/algorithm/algorithm (= 0.20200225.0) - abseil/algorithm/container (= 0.20200225.0) @@ -526,7 +525,6 @@ PODS: - Yams (4.0.6) DEPENDENCIES: - - AAProfanityFilter - Agrume - Charts - Down @@ -550,7 +548,6 @@ DEPENDENCIES: SPEC REPOS: trunk: - - AAProfanityFilter - abseil - Agrume - AppAuth @@ -595,12 +592,11 @@ SPEC REPOS: - Yams SPEC CHECKSUMS: - AAProfanityFilter: da9265eb541b83e126e36461b5eb47023fdcdefb abseil: 6c8eb7892aefa08d929b39f9bb108e5367e3228f Agrume: 0b1a42b5bfbc3aa9f0801f2857d8df1138cf2951 AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 BoringSSL-GRPC: 8edf627ee524575e2f8d19d56f068b448eea3879 - Charts: 354f86803d11d9c35de280587fef50d1af063978 + Charts: ce0768268078eee0336f122c3c4ca248e4e204c5 Down: b6ba1bc985c9d2f4e15e3b293d2207766fa12612 Eureka: 60cf058f86a8fb3ed26165ba5292b9850361b0a6 Firebase: fb5114cd2bf96e2ff7bcb01d0d9a156cf5fd2f07 @@ -639,6 +635,6 @@ SPEC CHECKSUMS: ViewRow: 8da541e9c019f3be63f4e28f311a62cac2045ecf Yams: ed1c49f0d6be84f305ad3f93f997b1df039afd9e -PODFILE CHECKSUM: 451efe7be3043a2b2342df9ebaaf9cf54f4ca4e8 +PODFILE CHECKSUM: edc4bc47e8c33a45a699c8689f3c9b12390cf338 COCOAPODS: 1.12.1 diff --git a/README.md b/README.md index 70fb262..133c29a 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@
- Swift 5 - Xcode 12 - macOS Catalina - version + Swift 5.7.1 + Xcode 14.1 + macOS Ventura + version