├── BeterAlert ├── BeterAlert.cpp ├── BeterAlert.h ├── Makefile ├── beteralert.png ├── peter.png ├── peter.rdef └── peter.rsrc ├── ClassicMacOS ├── PeterAlert ├── PeterAlert Data │ ├── CWSettingsMacOS.stg │ ├── MacOS Toolbox PPC Debug │ │ └── TargetDataMacOS.tdt │ └── MacOS Toolbox PPC Final │ │ └── TargetDataMacOS.tdt ├── SimpleAlert.cp ├── SimpleAlert.rsrc └── peteralert_classic.png ├── README.md ├── Win32 ├── PeterAlert.frm ├── PeterAlert.frx ├── PeterAlert.vbp ├── PeterAlert.vbw └── peter.gif ├── java-swing ├── PeterAlert.java ├── PeterAlertExample.java └── peter.gif └── xpeteralert ├── Makefile ├── peter.png ├── peter.xbm ├── xpeter.cpp └── xpeteralert.png /BeterAlert/BeterAlert.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "BeterAlert.h" 3 | #include 4 | #include 5 | 6 | AlertWindow::AlertWindow():BAlert(" ", " ", "Ok"){ 7 | BBitmap *peter = BTranslationUtils::GetBitmap(B_PNG_FORMAT,"peter.png"); 8 | SetIcon(peter); 9 | ResizeBy(50, 0); 10 | CenterOnScreen(); 11 | } 12 | 13 | bool AlertWindow::QuitRequested() { 14 | be_app->PostMessage(B_QUIT_REQUESTED); 15 | return true; 16 | } 17 | 18 | BeterAlert::BeterAlert():BApplication("application/BeterAlert") { 19 | BAlert *win = new AlertWindow(); 20 | win->Show(); 21 | } 22 | 23 | int main() { 24 | new BeterAlert(); 25 | be_app->Run(); 26 | delete be_app; 27 | return 0; 28 | } 29 | -------------------------------------------------------------------------------- /BeterAlert/BeterAlert.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | class AlertWindow : public BAlert { 5 | public: 6 | AlertWindow(); 7 | virtual bool QuitRequested(); 8 | }; 9 | 10 | class BeterAlert : public BApplication { 11 | public: 12 | BeterAlert(); 13 | }; 14 | -------------------------------------------------------------------------------- /BeterAlert/Makefile: -------------------------------------------------------------------------------- 1 | ## Haiku Generic Makefile v2.6 ## 2 | 3 | ## Fill in this file to specify the project being created, and the referenced 4 | ## Makefile-Engine will do all of the hard work for you. This handles any 5 | ## architecture of Haiku. 6 | ## 7 | ## For more information, see: 8 | ## file:///system/develop/documentation/makefile-engine.html 9 | 10 | # The name of the binary. 11 | NAME = BeterAlert 12 | 13 | # The type of binary, must be one of: 14 | # APP: Application 15 | # SHARED: Shared library or add-on 16 | # STATIC: Static library archive 17 | # DRIVER: Kernel driver 18 | TYPE = APP 19 | 20 | # If you plan to use localization, specify the application's MIME signature. 21 | APP_MIME_SIG = 22 | 23 | # The following lines tell Pe and Eddie where the SRCS, RDEFS, and RSRCS are 24 | # so that Pe and Eddie can fill them in for you. 25 | #%{ 26 | SRCS = \ 27 | BeterAlert.cpp \ 28 | 29 | 30 | # Specify the resource definition files to use. Full or relative paths can be 31 | # used. 32 | RDEFS = \ 33 | peter.rdef \ 34 | 35 | 36 | # Specify the resource files to use. Full or relative paths can be used. 37 | # Both RDEFS and RSRCS can be utilized in the same Makefile. 38 | RSRCS = \ 39 | peter.rsrc \ 40 | 41 | 42 | # End Pe/Eddie support. 43 | # @<-src@ 44 | #%} 45 | 46 | #%} 47 | 48 | # Specify libraries to link against. 49 | # There are two acceptable forms of library specifications: 50 | # - if your library follows the naming pattern of libXXX.so or libXXX.a, 51 | # you can simply specify XXX for the library. (e.g. the entry for 52 | # "libtracker.so" would be "tracker") 53 | # 54 | # - for GCC-independent linking of standard C++ libraries, you can use 55 | # $(STDCPPLIBS) instead of the raw "stdc++[.r4] [supc++]" library names. 56 | # 57 | # - if your library does not follow the standard library naming scheme, 58 | # you need to specify the path to the library and it's name. 59 | # (e.g. for mylib.a, specify "mylib.a" or "path/mylib.a") 60 | LIBS = be translation 61 | 62 | # Specify additional paths to directories following the standard libXXX.so 63 | # or libXXX.a naming scheme. You can specify full paths or paths relative 64 | # to the Makefile. The paths included are not parsed recursively, so 65 | # include all of the paths where libraries must be found. Directories where 66 | # source files were specified are automatically included. 67 | LIBPATHS = 68 | 69 | # Additional paths to look for system headers. These use the form 70 | # "#include
". Directories that contain the files in SRCS are 71 | # NOT auto-included here. 72 | SYSTEM_INCLUDE_PATHS = 73 | 74 | # Additional paths paths to look for local headers. These use the form 75 | # #include "header". Directories that contain the files in SRCS are 76 | # automatically included. 77 | LOCAL_INCLUDE_PATHS = 78 | 79 | # Specify the level of optimization that you want. Specify either NONE (O0), 80 | # SOME (O1), FULL (O3), or leave blank (for the default optimization level). 81 | OPTIMIZE := 82 | 83 | # Specify the codes for languages you are going to support in this 84 | # application. The default "en" one must be provided too. "make catkeys" 85 | # will recreate only the "locales/en.catkeys" file. Use it as a template 86 | # for creating catkeys for other languages. All localization files must be 87 | # placed in the "locales" subdirectory. 88 | LOCALES = 89 | 90 | # Specify all the preprocessor symbols to be defined. The symbols will not 91 | # have their values set automatically; you must supply the value (if any) to 92 | # use. For example, setting DEFINES to "DEBUG=1" will cause the compiler 93 | # option "-DDEBUG=1" to be used. Setting DEFINES to "DEBUG" would pass 94 | # "-DDEBUG" on the compiler's command line. 95 | DEFINES = 96 | 97 | # Specify the warning level. Either NONE (suppress all warnings), 98 | # ALL (enable all warnings), or leave blank (enable default warnings). 99 | WARNINGS = 100 | 101 | # With image symbols, stack crawls in the debugger are meaningful. 102 | # If set to "TRUE", symbols will be created. 103 | SYMBOLS := 104 | 105 | # Includes debug information, which allows the binary to be debugged easily. 106 | # If set to "TRUE", debug info will be created. 107 | DEBUGGER := 108 | 109 | # Specify any additional compiler flags to be used. 110 | COMPILER_FLAGS = 111 | 112 | # Specify any additional linker flags to be used. 113 | LINKER_FLAGS = 114 | 115 | # Specify the version of this binary. Example: 116 | # -app 3 4 0 d 0 -short 340 -long "340 "`echo -n -e '\302\251'`"1999 GNU GPL" 117 | # This may also be specified in a resource. 118 | APP_VERSION := 119 | 120 | # (Only used when "TYPE" is "DRIVER"). Specify the desired driver install 121 | # location in the /dev hierarchy. Example: 122 | # DRIVER_PATH = video/usb 123 | # will instruct the "driverinstall" rule to place a symlink to your driver's 124 | # binary in ~/add-ons/kernel/drivers/dev/video/usb, so that your driver will 125 | # appear at /dev/video/usb when loaded. The default is "misc". 126 | DRIVER_PATH = 127 | 128 | ## Include the Makefile-Engine 129 | DEVEL_DIRECTORY := \ 130 | $(shell findpaths -r "makefile_engine" B_FIND_PATH_DEVELOP_DIRECTORY) 131 | include $(DEVEL_DIRECTORY)/etc/makefile-engine 132 | -------------------------------------------------------------------------------- /BeterAlert/beteralert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/BeterAlert/beteralert.png -------------------------------------------------------------------------------- /BeterAlert/peter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/BeterAlert/peter.png -------------------------------------------------------------------------------- /BeterAlert/peter.rdef: -------------------------------------------------------------------------------- 1 | resource(1, "peter.png") #'PNG ' import "peter.png"; 2 | -------------------------------------------------------------------------------- /BeterAlert/peter.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/BeterAlert/peter.rsrc -------------------------------------------------------------------------------- /ClassicMacOS/PeterAlert: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/ClassicMacOS/PeterAlert -------------------------------------------------------------------------------- /ClassicMacOS/PeterAlert Data/CWSettingsMacOS.stg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/ClassicMacOS/PeterAlert Data/CWSettingsMacOS.stg -------------------------------------------------------------------------------- /ClassicMacOS/PeterAlert Data/MacOS Toolbox PPC Debug/TargetDataMacOS.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/ClassicMacOS/PeterAlert Data/MacOS Toolbox PPC Debug/TargetDataMacOS.tdt -------------------------------------------------------------------------------- /ClassicMacOS/PeterAlert Data/MacOS Toolbox PPC Final/TargetDataMacOS.tdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/ClassicMacOS/PeterAlert Data/MacOS Toolbox PPC Final/TargetDataMacOS.tdt -------------------------------------------------------------------------------- /ClassicMacOS/SimpleAlert.cp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/ClassicMacOS/SimpleAlert.cp -------------------------------------------------------------------------------- /ClassicMacOS/SimpleAlert.rsrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/ClassicMacOS/SimpleAlert.rsrc -------------------------------------------------------------------------------- /ClassicMacOS/peteralert_classic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/ClassicMacOS/peteralert_classic.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Peter Alert 2 | nyeheheheheh look lois im in the computah 3 | ## What 4 | It's a long story. Essentially, I had a weird dream wherein an alert box titled "Peter Alert" with Peter Griffin's face and a single "OK" button appeared. I decided it needed to become a reality, and it's now my "hello world" for GUI toolkits. 5 | 6 | ## Win32 7 | Made using VB6, tested working on Win2K and Win10 8 | 9 | ## Classic MacOS 10 | Made using Codewarrior 6.0, tested on MacOS 9.2 11 | 12 | ## X11 13 | Requires a few X11 dev libraries. Tested on macOS 11 w/ XQuartz, Linux, and OpenBSD. 14 | 15 | ## Haiku ("BeterAlert") 16 | Requires the basic development tools; such as make, xres, gcc, etc. 17 | 18 | ## Contributions 19 | - **Java (Swing)**, contributed by ethanf108 20 | -------------------------------------------------------------------------------- /Win32/PeterAlert.frm: -------------------------------------------------------------------------------- 1 | VERSION 5.00 2 | Begin VB.Form MainWin 3 | BorderStyle = 3 'Fixed Dialog 4 | Caption = "Peter Alert" 5 | ClientHeight = 1680 6 | ClientLeft = 45 7 | ClientTop = 330 8 | ClientWidth = 2640 9 | Icon = "PeterAlert.frx":0000 10 | LinkTopic = "Form1" 11 | MaxButton = 0 'False 12 | MinButton = 0 'False 13 | ScaleHeight = 1680 14 | ScaleWidth = 2640 15 | ShowInTaskbar = 0 'False 16 | StartUpPosition = 3 'Windows Default 17 | Begin VB.CommandButton Command1 18 | Caption = "OK" 19 | Height = 375 20 | Left = 840 21 | TabIndex = 0 22 | Top = 1080 23 | Width = 975 24 | End 25 | Begin VB.Image Image1 26 | Height = 480 27 | Left = 1080 28 | Picture = "PeterAlert.frx":000C 29 | Top = 360 30 | Width = 480 31 | End 32 | End 33 | Attribute VB_Name = "MainWin" 34 | Attribute VB_GlobalNameSpace = False 35 | Attribute VB_Creatable = False 36 | Attribute VB_PredeclaredId = True 37 | Attribute VB_Exposed = False 38 | Private Sub Command1_Click() 39 | End 40 | End Sub 41 | 42 | Private Sub Form_Load() 43 | Interaction.Beep 44 | End Sub 45 | -------------------------------------------------------------------------------- /Win32/PeterAlert.frx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/Win32/PeterAlert.frx -------------------------------------------------------------------------------- /Win32/PeterAlert.vbp: -------------------------------------------------------------------------------- 1 | Type=Exe 2 | Form=PeterAlert.frm 3 | Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\WINNT\system32\stdole2.tlb#OLE Automation 4 | IconForm="MainWin" 5 | Startup="MainWin" 6 | HelpFile="" 7 | Title="PeterAlert" 8 | ExeName32="PeterAlert.exe" 9 | Path32="..\..\..\Documents and Settings\Kokoro\Desktop" 10 | Command32="" 11 | Name="PeterAlert" 12 | HelpContextID="0" 13 | CompatibleMode="0" 14 | MajorVer=1 15 | MinorVer=0 16 | RevisionVer=0 17 | AutoIncrementVer=0 18 | ServerSupportFiles=0 19 | VersionComments="nyehehehehe hey look lois im in the computah" 20 | CompilationType=0 21 | OptimizationType=0 22 | FavorPentiumPro(tm)=0 23 | CodeViewDebugInfo=0 24 | NoAliasing=0 25 | BoundsCheck=0 26 | OverflowCheck=0 27 | FlPointCheck=0 28 | FDIVCheck=0 29 | UnroundedFP=0 30 | StartMode=0 31 | Unattended=0 32 | Retained=0 33 | ThreadPerObject=0 34 | MaxNumberOfThreads=1 35 | DebugStartupOption=0 36 | 37 | [MS Transaction Server] 38 | AutoRefresh=1 39 | -------------------------------------------------------------------------------- /Win32/PeterAlert.vbw: -------------------------------------------------------------------------------- 1 | MainWin = 44, 44, 622, 505, C, 22, 22, 569, 483, C 2 | -------------------------------------------------------------------------------- /Win32/peter.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/Win32/peter.gif -------------------------------------------------------------------------------- /java-swing/PeterAlert.java: -------------------------------------------------------------------------------- 1 | import javax.swing.JOptionPane; 2 | import javax.swing.ImageIcon; 3 | import java.io.IOException; 4 | 5 | public enum PeterAlert { 6 | ; 7 | 8 | private static final ImageIcon PETER_IMAGE; 9 | 10 | static { 11 | PETER_IMAGE = new ImageIcon(PeterAlert.class.getResource("peter.gif")); 12 | } 13 | 14 | public static void showPeterAlert(){ 15 | JOptionPane.showMessageDialog(null, "", "Peter Alert", JOptionPane.INFORMATION_MESSAGE, PETER_IMAGE); 16 | } 17 | } -------------------------------------------------------------------------------- /java-swing/PeterAlertExample.java: -------------------------------------------------------------------------------- 1 | public class PeterAlertExample { 2 | public static void main(String ... args){ 3 | PeterAlert.showPeterAlert(); 4 | } 5 | } -------------------------------------------------------------------------------- /java-swing/peter.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/java-swing/peter.gif -------------------------------------------------------------------------------- /xpeteralert/Makefile: -------------------------------------------------------------------------------- 1 | build: 2 | gcc xpeter.cpp -I/usr/X11R6/include -I/usr/X11R6/include/X11 -L/usr/X11R6/lib -L/usr/X11R6/lib/X11 -lX11 3 | -------------------------------------------------------------------------------- /xpeteralert/peter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/xpeteralert/peter.png -------------------------------------------------------------------------------- /xpeteralert/peter.xbm: -------------------------------------------------------------------------------- 1 | #define peter_bitmap_width 32 2 | #define peter_bitmap_height 32 3 | static char peter_bitmap_bits[] = { 4 | 0x00, 0xf0, 0x03, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x2f, 0x20, 0x00, 5 | 0x80, 0xe7, 0x78, 0x00, 0x40, 0x16, 0xc7, 0x03, 0x40, 0x55, 0x5d, 0x04, 0x20, 0x10, 0x61, 0x04, 6 | 0x20, 0xe0, 0x20, 0x08, 0x20, 0x10, 0x1c, 0x08, 0x10, 0xe0, 0x20, 0x10, 0x10, 0x00, 0x7f, 0x10, 7 | 0x10, 0x00, 0x40, 0x10, 0x10, 0x00, 0x20, 0x10, 0x10, 0x00, 0x20, 0x10, 0x10, 0x00, 0x20, 0x10, 8 | 0x10, 0x00, 0x40, 0x10, 0x10, 0x00, 0x80, 0x10, 0x10, 0x40, 0x80, 0x10, 0x08, 0x40, 0x4c, 0x10, 9 | 0x14, 0x80, 0x33, 0x10, 0x27, 0x00, 0x00, 0x30, 0x48, 0x00, 0x00, 0xe0, 0x90, 0x00, 0x00, 0x28, 10 | 0x20, 0x01, 0x00, 0x14, 0x40, 0x06, 0x00, 0x12, 0x80, 0x08, 0x00, 0x09, 0x00, 0x31, 0x80, 0x04, 11 | 0x00, 0xc6, 0x40, 0x44, 0x00, 0x08, 0x26, 0x42, 0x00, 0x20, 0x90, 0x41, 0x00, 0x80, 0x03, 0x80 }; 12 | -------------------------------------------------------------------------------- /xpeteralert/xpeter.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | Display *disp; 8 | int screen; 9 | Window win; 10 | GC gc; 11 | XSizeHints sizeHints = *XAllocSizeHints(); 12 | 13 | #define WIN_WIDTH 180 14 | #define WIN_HEIGHT 120 15 | 16 | void init_x() { 17 | unsigned long black, white; 18 | 19 | disp = XOpenDisplay(NULL); 20 | if (disp == NULL) { 21 | fprintf(stderr, "Cannot open display\n"); 22 | exit(1); 23 | } 24 | screen = DefaultScreen(disp); 25 | 26 | win = XCreateSimpleWindow(disp, DefaultRootWindow(disp), 0, 0, WIN_WIDTH, WIN_HEIGHT, 5, BlackPixel(disp, screen), WhitePixel(disp, screen)); 27 | 28 | XSetStandardProperties(disp, win, "Peter Alert", "Peter Alert", None, NULL, 0, NULL); 29 | sizeHints.flags = PMinSize | PMaxSize | PSize; 30 | sizeHints.min_width = WIN_WIDTH; 31 | sizeHints.min_height = WIN_HEIGHT; 32 | sizeHints.max_width = WIN_WIDTH; 33 | sizeHints.max_height = WIN_HEIGHT; 34 | XSetWMNormalHints(disp, win, &sizeHints); 35 | 36 | XSelectInput(disp, win, ExposureMask | ButtonPress | PointerMotionMask); 37 | 38 | gc = XCreateGC(disp, win, 0,0); 39 | 40 | XClearWindow(disp, win); 41 | XMapRaised(disp, win); 42 | 43 | Pixmap bitmap; 44 | unsigned int bmpWidth, bmpHeight; 45 | XReadBitmapFile(disp, win, "peter.xbm", &bmpWidth, &bmpHeight, &bitmap, NULL, NULL); 46 | const char* btnText = "Ok"; 47 | 48 | // Check for window close/button events 49 | Atom WM_DELETE_WINDOW = XInternAtom(disp, "WM_DELETE_WINDOW", False); 50 | XSetWMProtocols(disp, win, &WM_DELETE_WINDOW, 1); 51 | XEvent evt; 52 | while (true) { 53 | XNextEvent(disp, &evt); 54 | if (evt.type == MotionNotify) { 55 | // Redraw events (button hover) 56 | if ((evt.xbutton.x > 58 && evt.xbutton.x < 122) && (evt.xbutton.y > 75 && evt.xbutton.y < 99)) { 57 | XSetForeground(disp, gc, BlackPixel(disp, screen)); 58 | XFillRectangle(disp, win, gc, 60, 77, 62, 22); 59 | XSetForeground(disp, gc, WhitePixel(disp, screen)); 60 | XDrawString(disp, win, gc, 85, 92, btnText, strlen(btnText)); 61 | } else { 62 | XSetForeground(disp, gc, WhitePixel(disp, screen)); 63 | XFillRectangle(disp, win, gc, 60, 77, 62, 22); 64 | XSetForeground(disp, gc, BlackPixel(disp, screen)); 65 | XDrawString(disp, win, gc, 85, 92, btnText, strlen(btnText)); 66 | } 67 | } 68 | if (evt.type == Expose) { 69 | // Draw button 70 | XSetForeground(disp, gc, BlackPixel(disp, screen)); 71 | XSetBackground(disp, gc, WhitePixel(disp, screen)); 72 | XDrawRectangle(disp, win, gc, 58, 75, 65, 25); 73 | XDrawString(disp, win, gc, 85, 92, btnText, strlen(btnText)); 74 | // draw Him 75 | XCopyPlane(disp, bitmap, win, gc, 0, 0, bmpWidth, bmpHeight, 74, 24, 1); 76 | } 77 | if (evt.type == ButtonPress) { 78 | if((evt.xbutton.x > 58 && evt.xbutton.x < 122) && (evt.xbutton.y > 75 && evt.xbutton.y < 99)) { 79 | break; 80 | } 81 | } 82 | if ((evt.type == ClientMessage) && (static_cast(evt.xclient.data.l[0]) == WM_DELETE_WINDOW)) { 83 | break; 84 | } 85 | } 86 | } 87 | 88 | void close_x() { 89 | XFreeGC(disp, gc); 90 | XDestroyWindow(disp, win); 91 | XCloseDisplay(disp); 92 | printf("Nyeheheh hey Lois remember that time I was on X11? Frickin' schweet.\n"); 93 | exit(0); 94 | } 95 | 96 | int main() { 97 | init_x(); 98 | close_x(); 99 | return 0; 100 | } 101 | 102 | -------------------------------------------------------------------------------- /xpeteralert/xpeteralert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kokoscript/PeterAlert/3297ff7a9da04f7c1eec8c2bc2b5b5aa3f909808/xpeteralert/xpeteralert.png --------------------------------------------------------------------------------