From 3079d8e2708066c2f3f1ad79abe77c7c41c38879 Mon Sep 17 00:00:00 2001 From: Sami Ahmed Date: Sun, 7 Jun 2026 01:25:14 -0700 Subject: [PATCH 1/3] v1.6.8: public composer, beep wordmark on posts --- README.md | 114 +++ assets/beep-bird-badge.png | Bin 0 -> 2144 bytes assets/beep-bird.png | Bin 0 -> 22508 bytes assets/beep-icon-small.png | Bin 0 -> 6042 bytes assets/beep-icon.png | Bin 0 -> 144983 bytes assets/beep-icon.svg | 1 + assets/beep-logo.png | Bin 0 -> 3013 bytes assets/beep-logo.svg | 1 + assets/beep-wordmark-blue.png | Bin 0 -> 17536 bytes assets/beep-wordmark.png | Bin 0 -> 17492 bytes assets/beep.css | 1077 +++++++++++++++++++++++++ assets/beep.js | 1126 +++++++++++++++++++++++++++ beep.php | 39 + includes/class-beep.php | 116 +++ includes/class-cpt.php | 48 ++ includes/class-elementor-widget.php | 127 +++ includes/class-likes.php | 144 ++++ includes/class-media.php | 395 ++++++++++ includes/class-moderation.php | 50 ++ includes/class-polls.php | 446 +++++++++++ includes/class-quotes.php | 102 +++ includes/class-replies.php | 252 ++++++ includes/class-settings.php | 1118 ++++++++++++++++++++++++++ includes/class-shortcode.php | 278 +++++++ includes/class-shortcode.php.bak | 292 +++++++ includes/helpers.php | 589 ++++++++++++++ readme.txt | 81 ++ 27 files changed, 6396 insertions(+) create mode 100755 README.md create mode 100755 assets/beep-bird-badge.png create mode 100755 assets/beep-bird.png create mode 100755 assets/beep-icon-small.png create mode 100755 assets/beep-icon.png create mode 100755 assets/beep-icon.svg create mode 100755 assets/beep-logo.png create mode 100755 assets/beep-logo.svg create mode 100644 assets/beep-wordmark-blue.png create mode 100755 assets/beep-wordmark.png create mode 100755 assets/beep.css create mode 100755 assets/beep.js create mode 100755 beep.php create mode 100755 includes/class-beep.php create mode 100755 includes/class-cpt.php create mode 100755 includes/class-elementor-widget.php create mode 100755 includes/class-likes.php create mode 100755 includes/class-media.php create mode 100755 includes/class-moderation.php create mode 100755 includes/class-polls.php create mode 100755 includes/class-quotes.php create mode 100755 includes/class-replies.php create mode 100755 includes/class-settings.php create mode 100755 includes/class-shortcode.php create mode 100755 includes/class-shortcode.php.bak create mode 100755 includes/helpers.php create mode 100755 readme.txt diff --git a/README.md b/README.md new file mode 100755 index 0000000..4a1861f --- /dev/null +++ b/README.md @@ -0,0 +1,114 @@ +# Beep + +A Twitter/X-style microblog for WordPress. Logged-in users post short updates with rich media, polls, GIFs, voice notes, and quotes. Like, reply (with nested threads), and share beeps. Designed to look like a Twitter timeline, hosted entirely on your own site. + +## What's in v1.5.1 + +### Core Features +- **Post beeps.** Short updates up to 280 characters, with a composer at the top of the feed. +- **Like beeps and replies.** Hearts on every post and every reply, with a pop animation when you tap. +- **Nested replies.** Reply to a reply, to a reply, to a reply. Visual indent caps at two levels (deeper threads still nest structurally). +- **Latest / Top tabs.** "Top" sorts your feed by like count — a built-in way for readers to surface the best stuff. +- **Per-post Beep badge.** Every beep and reply carries a small bird icon in the corner, branding it as a Beep. +- **Friendlier visitor experience.** Logged-out visitors see clean read-only beeps; logged-in users get the full interactive feed. + +### Rich Media +- **Image uploads.** Attach up to 4 images per beep. Previews in the composer with remove buttons. Images display in an adaptive grid (1×, 2×, 3×, 4× layouts). +- **GIF picker (Giphy).** Search and embed GIFs via the Giphy API. Configure your API key in **Settings → Beep**. +- **Voice notes.** Record and attach audio notes (MP3, OGG, WAV, WebM, M4A) up to 20 MB. Inline audio player with play button and waveform visualization. +- **Quote beeps.** Reference any existing beep as a quote. Loads the quoted post's author, time, and content inline. + +### Polls +- **Create polls.** Add a poll to any beep with a question and 2–6 options. +- **Vote on polls.** One-click voting with live results displayed as progress bars. +- **Poll management.** Add/remove options before posting; polls are cleared after submission. + +### Thread View +- **Conversation modal.** Click any beep to open a full thread/conversation view in a modal overlay. +- **Nested thread display.** Replies are indented by depth for easy reading. + +### Settings & Integration +- **Admin settings page.** Configure character limit, Giphy API key, and other options under **Settings → Beep**. +- **Elementor widget.** Drag-and-drop Beep feed into any Elementor-built page. +- **Magic login support.** Works with passwordless login plugins for frictionless onboarding. + +### Moderation +- **Delete any beep or reply.** Logged-in admins see a small × in the top-right of each item. +- **Approve replies before they appear.** Settings → Discussion → "Comment must be manually approved" puts replies in a queue at **Comments** in the sidebar. +- **Suspend users.** Users → click their name → scroll to **Chirp moderation** → check **Suspend from beeping**. + +## Install Beep + +1. In wp-admin, go to **Plugins → Add New → Upload Plugin**. +2. Upload `beep.zip` and click **Install Now**, then **Activate**. +3. On the page you want the feed (your one-page site, a dedicated "Feed" page, etc.), add the shortcode: + + ``` + [beep_feed] + ``` + + Save and visit the page. As an admin, you'll see a composer at the top — type a message and click "Beep" to post. + +## Invite friends (with magic links — no passwords) + +This is the easiest way to let a small circle into your Beep feed without setting up Google/Facebook developer apps. The flow: + +1. **Open registration.** Go to **Settings → General**, check **Anyone can register**, and set **New User Default Role** to **Subscriber**. Save. +2. **Install passwordless login.** Plugins → Add New → search for **Passwordless Login** (any well-reviewed one — Cozmoslabs or Magic Login both work). Install and activate. +3. **Share the sign-up link.** Send your friends a direct link to: + + ``` + https://your-site.com/wp-login.php?action=register + ``` + + They type their email, get a one-time sign-in link, and they're in. No password to remember. +4. **They can now like and reply.** Liking and replying require being logged in; your feed remains read-only for the public. + +## Shortcode options + +``` +[beep_feed limit="50" header="Messages from" sort="latest"] +``` + +- `limit` — how many beeps to load on first render (default 50) +- `header` — text shown next to the wordmark (default "Messages from") +- `sort` — initial sort: `latest` (default) or `top` + +## Elementor Widget + +After activating Beep, you'll find a **Beep Feed** widget in the Elementor panel. Drag it onto your page — it renders the same feed as the shortcode, with no extra configuration needed. + +## Branding + +Swap the bird/wordmark in `assets/`. The accent color is `#1D9BF0`; find/replace in `assets/beep.css` for a different palette. + +## Changelog + +### v1.5.1 +- Fixed critical IIFE scope bug — all functions now properly access `config` and `handleResponse` +- Removed leaked Giphy API key from JavaScript source +- Fixed voice note upload not clearing composer state +- Added CSS for GIF picker modal, poll compose section, media preview grid, voice note preview +- Added loading spinner and empty states for feed +- Added responsive styles for GIF grid and media preview on mobile + +### v1.5 +- Image uploads with 4-image grid +- GIF picker via Giphy API +- Voice note attachments +- Quote beeps +- Polls with voting +- Thread/conversation modal +- Elementor widget +- Admin settings page + +### v1.4 +- Like beeps and replies with pop animation +- Nested replies (multiple levels deep) +- Latest / Top tabs +- Per-post Beep badge +- Read-only mode for logged-out visitors + +## License + +GPLv2 or later, same as WordPress. diff --git a/assets/beep-bird-badge.png b/assets/beep-bird-badge.png new file mode 100755 index 0000000000000000000000000000000000000000..00c286e86f76a28b23e0bfe3e3d8dd114d942ea0 GIT binary patch literal 2144 zcmV-m2%q1gICR;B%~3Xlje)vpXUx>;$THc)C1#>w+SbI( zu|Ler5_L$HiCJQC6R=}228GNI6cLCisG!2YL0bxKX?s83bDqaP-jbqHdiw#JNq@@I)OaLh0eOn*& z^kc2E_=V_QFt8p#tskzY%jEzABq_V)1%s;}6g}ra>9ptcw+;9PmgJYb_Ce9Tq}4BI z8jYsQ;6NP%4U$4rHJOQrp)n?6Bh-2Ll$(ETbz7>Hn0IKQYFTLQ0W5 zk}2`6Yv7a1MAAauu#&0*AW{KX495efZR=Y7ouBXj)&M&RsBy#9I#v`SV10k!ZeK%` zS|-SNC^5)`7{o>h@CM|JQbv{Zhf%OMTY&sXj0eVyLUjhHb(OJKo;6y&Ov1hpf&gk& z3`D8pZ-x^yAcdAm*=bKN+|hpkB!G^%1^{ES1C0h~aFcoSmkp+^@RD;-1ONjRsv&C> zL67s{>3m#2O14f>n8_IA2dAi`|9CI#Q+2%1;Ma-2Lry|!0%P` zi7G=R>^5lceWx8DphbZ?OR&!~#bTtn{`(RUgF=7=1b|Fmm%<6D1rVM+f!cJGLugbK z8bu5!1LUiMS05s+xJfkQ2!RD~* zH9=*qHL0r|-af1po>lTt^!2c1^3>fP^r)&MuRYr$Iqiecr;d?l zjT*@c5TN)F_SzGs>o}N?c*(R_Q}P)>*CCa{8)4j^+1p~$!f9E5azV_LKVztTuBWu9 zb{=VUzr6vd4=>LDs1eN9m=WwiBLnqx!kk?QHf-!CA2O9FBB; z`jTmO7%>p_`Q_ML8U(=~lnXud-0xV6-UE?Y3i^ehYoppm zUlPh^!euRK{5lBl4$-#^;Ebj6Elk%u?iCR3I>ROrbDI89Yq;R<0plAani)umN>&)H zop^`3D!@>SBpms8kYollL(a|h}eI7m}s3!j0$_uf!*8;m#m)HsGx4Y>Go zBm|*z&17QRi9XqM)ruD!BbkM%5hHmZf2)WT_HO z3#^%>D7#5Cqu!l)szaBqx>RNw4ux#8sNj9Ay{isZVA~8fu}y5uOd~0Hb7T{!eZ{HF z1IGX$6>oX~zH}Wzx!$wCN6CMSeCO;Z&d52%JD~g$h(K;}I6u-WmOx1ir){&gsbIRAu`JZ>}*5#_P?-clw4`k@1a!dCBbvB84(_r{#0F#&AeW!KNV*rp0UYkXlEu88$AJ~iM!+skF4dh`s&}e`b zO`6+oXT)~^o-5{< z+%G7L0Um%D!xCzknoS&gf7F$_zj~iYvKIVH$Um10yN`9@lbsd8>&uL(Tw{GXgxetQ zWKFA2zZvNqI*9YE1C0hCpE6tSW1cuye9nQK70P`V0JWpN57~yb|NT{E(HlwfnVI6d zJ3STTOnCaNLFiiXg^vD3F{eZNNu_K&=BW2k(%5v-#C5=uoza{;H1gPi=#*^+ZVt}b z#C}G6CMXV}*59<|7Jjrpz%;6uE&cLlY4pEgkU6)Gqi>+Y?R`doMgst;*rw%E3Jz$> z{604&*rStUuYByn=NE@kWMEzYrF8K#pGMQ)6ZM~Ld<+?5LcxFN~A9=h=U|0(i6c)b$HvkoW^@SWc6v>C@0#lHa< W>DCIB;1q2BMybuAB{-=G2|$Xd^-htq7Wou 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 VvZ&+{mG*yQ8Y;TVwTiZ&{{bHtuW|qY literal 0 HcmV?d00001 diff --git a/assets/beep-icon-small.png b/assets/beep-icon-small.png new file mode 100755 index 0000000000000000000000000000000000000000..56a4c45f8c2e8a20b01acaae14c93617f35813ac GIT binary patch literal 6042 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 UTfJDM>;M1&07*qoM6N<$f{z#Lq5uE@ literal 0 HcmV?d00001 diff --git a/assets/beep-icon.png b/assets/beep-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..269c34b5bfa7155e6df8787aa2b2a128ea73ea8c GIT binary patch literal 144983 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

$(n9FS7J3ZwIw(-KsoUI^NE!SQm+BbZnZ@0Z$~h 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

pO-v%GI# z%b7ySum8|;)c)+UGK#+V*6fRxE?*{#3d39opX`Pd@Zo4qb&_(sL!S1C^D`14hjizE zM4TQw*#J_2Bx;@gZtcJHz6v6yb@Js;w@eEG1!yRVOK^vS-h!pzJ0s6m#REH(%->}{ zctTcgg0E<07>q+IZCNc_w>C!~()Ep}Z<}xo-hImd7r{TD00ciw#TCd9#3`3Ob@PXx zENT%h;x-9l=#t!=!_g;0DSadbI(O|@L8-G`qBrLpGU#yAY^h; z*fPqA(2zp0!c-d1()q9FF6di&Xgn9vDr3xv(E>yF$3>DtWWz79=$osk@_xtMq1Wyq_i#Y1I#NgYkOGjT^Box+vs1DN|F8`@=lQQd z69odu_u>n&p(Tg#4mmVO11O!3}B?%!brICar zlmI~jK0*fx+n8Pql4%CqFu3>LyV{mFbH6`cn|Uh|V<0rWUx?eTcK7Yf+Rwg1RG*prBWF$5_|WYSqauuo6(_#=nD{math%X@Z>y{~Xm zTAlp9g{!8fh7l3{>aG_bnY(yn`*740QW968A&H6%H~4xF{#WlCmV?q$*U+V)6mCGH z!o!_N0!azLS!i!QkKe(Z7*73t9-+jxtGZ5_x@rR;h*_r^@UpOKrnQ2V0Djt0O;kzEK zJ0+88v<%ZQ>_sLO+)05(o$87d)-<7Q6Nyfx%td-uC#R2_$@uLpfZ}ItO z9`(R+WBNRfh&$Y$@XzZ`&X^p4h&sJeyRdBPj3pObcIy-SFIlq#cI<8d#-tUCn~WqO z0r&f++37!1A|wAzA{GN=;L1ezF8 z(EU+agTC!B_zG$6e3#l{fEGljAkbz|ULQdKXObEln?zwj2jhsL19o11eo5uUXB_a$ zf8H+K5!75O(eK;2QmK@YOeU@M+ndII^!fU88=7{@g2I@69=KW-!F*Q{Y;uM3(a#>i zbFFMa%oNn30ewD5VWZK?&%9S3*HO!6qKf?07UGo8tOte;269xK+Y+fPD^14-l0t) zKjo+c;H0C5ymQ&vWA2EC`IKK|B>(_RR99n7GAT+*O1{)MSPOx_%j?sYUv}khpS`;F zlhwTzuiOBfqg4>MiH=eTK#)qXcG=51j1Qn#>jn%(T!J2wo)EZ#O};XqA1?ih8Wi*Z zAfP}F!K2EP0aitYlt}_N(bD}OgQ$&a7erc$;)xoOe!zS4D9kWvf*8H`*Vj-b|0py1J*Q<0RGmV%z;C99;N97OIUR!(G^EPm+7!Oge* zY~25yGIpQq9rsH1eQ@||O#r^cRb5@plcPuHMt;8Xu)jS#^{1bHw#X`IUtkE!^40NB zVYaJBIq6Iiug6OOj5Dw#iFADv>(ZeeFDV%bXPh`{(m5v|cn2a*ztnmCu*qQYip|G9 z_2SG!uljBEl{4qB@3COndPrLWkf9Zc7z~7oLRy@p^a7DSTtJ?dJ}53$YEKzGbt}|@ zkUcJ@AOi@x2Y?bxY&ckorluwUVthca?tH}l-8T*2ulqx(YfgS49O5%CPuPLqRqm_# zk^(+01pcnCPh0uZ(%Y)9s{43x?=us2dZ&6#EDBmzA080e@5mfzuKhTrj+jLIzpiD8i%8X9prz4@N zvY`g}D?ik3;|NJ2lg{xT9Xj*kL-yTv$yrA{I&SQMoB#R?0i~6dW>r~PuA-u~>i^cy ztYnFG`h{DH-~4dt*v51d#p6*%QUapQX+dDR+8_DtK`+@=M(13%zv|_o5lcx4v}zm6 zBfk+3~fG;UmS{?W}>oPFdOqla~U1AJH2ADpIz@uS~J z^X3r|jlSgOr(S*g!?{+xZJ1lx95SXb3WkA5iH{(Fm_2K+rp$7;g7rIki?1G9HZqQR)Xc*@pt(<6VXvAnF#zzhs2#1X9 zyWz;ghCF=U2}7z7ac%jv_JcjG{;wYRyVXu#{nN7BYp$&OU|H|Qt5*Y>XvGU-Tml)E zm31hY3Od8o7KYo|%%4|A=fT=Ykb(#hDm`@42Oc3f|F0n_0SRPOQY%8O%2)3-srOwW z^HE?Dz&+%Aiid(2cqbwFD2FriiO%?;_69+LkB|W|CYqYE)TXeFF>3#QThBP|fJc9E z@nH`j;z|HusT4s)Yt{c9=vERIm)9W?#mn!0xqRW$jdt}fCC8v?Q{ER2ig^@j$teSM z@`wE7fIyp&(Gq6$@jw7lKrCud_wMb*myQ3a@^Y-OUv1F*g&PDSk?X>z@fOinQ**sB z{1yQMFz|gX0?w?Y$b6Gx2aJqSHfKq(yOAAs$Z+HM!v;N{y5@vmBjS?M${A*5=_u=m z>RxI5h&K{LEGMG!*l+K8>FsA;{I5O8{IZ(wEd~C!K3aa+&woFuY|6AH zy%#K71DvCXw~a9=q#-Q}+?gbDCmVtvihPqCWd5P$9ekLt{^uQPic}sc<|yQYsftjZ zK1+z0uOr}5Mb+7B2%s=(dZCPxqJENVaHrPV(5g5F>X<5Ou8ayIK+>kRB8ukbW(bGl z{E*@O;f&))PrLMj!>;Zc#!qj$#1okjtyTYb<0>yN$Eg(+R&zP^tovly*oLMih!=zv zgC`7_ODS|9L`ADaLA6|;3Cj2JaM4c+*yILiG4?r=%|g#E9dPJA-M@5PDJm*503iF( zr^`;?up`r+q|6dQNcGLoO?yZ~HuN^AG8Mp>Cy=F`en`L=ktHnI+|b1P_v+2Z6%T1T z^VBhy6(899c|^2afu*XlAMSekaV7vZ=?^)p5jX#R_?-_u`FfbLxuUv&YEtbBUf_-(s(-I%$Z3 zyE-pgvKrD>7J#9MghLn)M;S>361J4ER++mq{N#_cfZDfGf(R-a1sXFQlv!Yx6-z3) z&7R{$AmAKjhAOqqLG>1|J!zBglK??tOO0b?NI1z|=4xU{6+{Pr;ruUhfUYNV=wM?OO0 zGU_Q1^uZs?(|CDGW#LJOLcS=U#-47;uUBzWv)e@EcW6i*5hdNt$8A-3hqum0@t1+` zY8K>d_}T?JF$#&Oxv5DqBg%^g^n=4j_W9`2GY|Pw@gW0W`sGgv#-?hGVyKhfCu`Fm z!}apZ8#n;Sn^VtTID7F%3PnswQgSaT)GFm*lBinv`aB<({O37F>b5t&ri9XN^pPrW zVu%<+=+Ys&Jr*-}0stlwi9N2G=gpfZiOBftgRk{iv33)fkr0#8F~Z8Tod!=A!$$|u z2enX5nx&7kp>11*j8QI^mFdQ2-m$P9KkU$b8-H^4QBR$H+>m<^alQlj|0p~xev}D7 zY1K@llB&hCugv~e`Ms}R*^p@#k#LwxDP3h3@V(tp=_Bj<(e{{iBzkA`t%YXIw!JjW)51Y5|hF!bs0U#&BVFMy&7>R&O=_=+C z=p!vEl&jBwYhz{L!?>;~4=6z~C^CcU1Q_@`iXlo%c^nxNlE-HvEK`Jd2 zB-(SG0~dpoYtla}0e*o@G5XUDr0W5ApG^(>j&TbzPK}LC0tFdE_UXrm4el{*{0U?J zcNT7$|V;U%al2T(zlK_#wJKNHVPIAgBjuw zEetb|2A4U@hmz56Gk8pFZ-YrizEkn8MrG3?`guH&id8tOT><%SuX1I;83LfBbYoh8 zu#CcJ7)FiU55^ocbjI1^4tnvhqOMhlxas-}002^~y1K}**|NEm^F8Ouhknj1BOsU3!{vr;4)_gh{y`rPK7Ip@^$%D=-oRCRB;?d%!hOb zG0-Y*P^23bTowJXzMv;UzSp{cfV!-GQb#S(M|n_j@pDawum#mARZNIT@5SoKfWCMM z2(mc~4<0eZ7(KYdx+4x6T=vtmM!)jx-2y-%Znnbx-_0wTtYI}Z6(ZK-ko`Vex}^gd zCl^M=`&;Q8Ve0(gPz`~tIA_?TA?17Nu$dGB2zxM-7Q35GM&kg$XdKt&z^kfzTN7N zI%M$E*Is<|KMTV+?~a?aHs+5C@%m9E08URQ`_`u`M&45K{52ncw%m%giCsA?&w$FaiBR^;0tPnI-rgrf#8_{fDP`huu^Zb^cG7#=aA@1i??b>3}b_G>rO zCivNi&R$wBw_g8y6d-oR?N9$^%l1YJhfE^rNL;I^p0jZC1HW!2rRz&5>kUau8bQf} zF>hZ0FvcM(ENs^%MD5$h9!5k;R9AnA3fk`f*Ss=2v3aM}7JzaRr0EM;1<^6*T}f%b z55^Q#AKR6Pft13^QDajx02+Kyzn*Z^$N}|-9Xjl(OUDnt4-x16x)cBs)jTyMK@}BW zzKz+M0DQkHf1XUD*xb-C^6J}a-kLdYRmW)DkYGvFty+DSspb{qH*I~pUj#4=4jZ@E z10v^!VTwrHWB_55LUKt0K#<2)C#}CrT5SqJ6}~)6StS^f?+vf|ae8^Y!Wwsj3Nm}X zJCn``k&`?Ui}EoC><^=gdaXO;fd2PiG;ZWW2E(nw(Z{T=uEvDZ-><3p(uWk5mjhN* zAXFgAkcqHvd$#!TnyJ4!_u8uCKl*ev>}+ZT#!y6JAx4ro2%#7iQ9w+G@@9A`pznvu z<2A~jihTyy`s!in3jwNQmikB@DG{G2KjBbGmf8^-AY^$2KMk6(e<(6k6dUzJSgqxQ zJOfSHUmY)W6wfkE>DA_H#2^qw*R26ZJ`=uxTq0LmGtI_SCo&Je*$r*Tlf!FbG(BR&V% z^9cZ_tzi+7`TKicJ$==hO%M)q?n$R=EiRq-=kpa1(D7BVEFrT^8RUSxZ9D=a_v;6v zhV@@?&Z%SSju_tKK17`VQ>U;Q;spL5vw-!FA_1@o9Z4XfuD9Iz@|%-i{-`658iEKp zDos*V7|-LIp_2KcKY9g9pfOF;oyq3Xl0YE*gW40<2$0BJ=4}91)5+rbz3aT-j)AI> zNMWTTFwRL3$mYh31Y~C4?%j-``*eYQ`gVBjym5y;J?4P!Zy@59pFj}iPwvfq#`5wy z*O`yPAqF2U+E((?t21vo=c)%!{N(dh(9qBzBZV=FL`+7KxD*1sF(OZ;R%>K{K6;0W zOP6j@tj^}UI_QKl=%J(COw}kQ&!NvhXY_+JU?zmx&(zR*&0B|p+(6KDfb_9VKp?UH@>>GDQ${2^11IcT5f@B2-&hiJNizjamp2oeBC)}Cw0sU{ryh^f`95GNkxeeDVxiQTyxflMq>Qn;rsIa26S3~(CGc|y=dHlGrJVBDfiw^ z-lnLoPDp!<@5|rcnwlCmWycQYXu?}W)b*7Q77lsio%uIk`HO#_GD#Sog=AiQuCdUum;f^q7uwA=%<(__d zR&m5&Kd&e&Dc^q2t6>1hv>t=s{cH2)c}PUj^KX3gxLx(lU>LsnXkOg+x`%eRXCEn2yg zG1IVs&;;bZhY3<3TXyz3XOPWgq!}(`!w2?+BSsHiu}`n|FCKhgzYk70d{E5`O&PfJ zRtG_`?bPAR^!SN%ig9^e9q&_CVJVEz7I zZ`}K@XQo}%kZH0)reR2_WW_4mo2hb>(j7GO79BZoa=z(=zW)eZMJ@$FP3Gz3P8CqcQ{lo=*RBuYY#UFa9{;s<%E^)Op3GMrdr_O_7KxV}%7=3JF45 zwrZini;#+go~v-DlIpw>B~%PM6bVvBEs!+>-w7&w3f18ZzmV`rc~ua#p%Ye=KLEkIlkIe_iGKY-`&e0&{`QNAF#6_dqi`?ZW(VAHzY~T{|j5F@I4=2@&(N( zur^6ayw#SK+I&K#HKuMcWB{3LmiOz?2@XDB;ACgKcaH<#`t>gfB7$pw^VGQIYc{e_ zG)yFgkLHo@Z-E}_$AED`>4x33PrrWb?9;~1IR5ZKe;t3+pqj>}jIudXSX*1nN=izs ziVBn!6?+u$v8rk&pE+|Tv|w`er3}mHib-pbamucz|zV)0!}3VzTDK94lcUq=jR{x zNhHK;@4n4WP7~GDJOMVTucV~J`m*vP zubrQmzib2Jk+2{|B@dZ0yrP{a6sY}CPl&x$#vF~2eA``b24C^dP^AWtF|aJcp#!@$ zjvG5<3L;V}ICuNSX9-6{@w1=Zlvuj1;n1`tL^NV>*Nlo#-_I`kiHt$Iv6+gGJeXa6 z_F=!i{OmDz{3YWaWhv$ceSiuoDf!RZ{q}hV{F!H}&VQT_joh`X-4Aivt*8_HL8HSu}#>d@)$Tk%*3K3}r=_=&H7dc$c~K62vBd23+Z zmTh2|hKLqM8Aypz2riJkmIbK+&P|M@KEoXF8rExhwW37|JdP<3Ax)8w)bTk|05^Jc4nYM+tBlMb+yLcB!sQk|L&Ue`HJFQ4OuV@g9xPJ z72(5(HWDNi;i>#1jsmn+UF*VE|MOZ_03Omt$~i=cU`evtw(GzK_3!Zx0IW-;YK@9L zod2(?n#mARJT`Iaai1<;Pi7?Sh#G1Rx=%&w?pMxOv!$``n)O?0*RDoH zB$dYojzx2w^%`lNofOOzIvOY zg{33_x&RPqL@?5j03`;g;?v;B13Np?Q{nP_1N^46H@B;Z`6x;;Hq7l*$Bc85f@C_K z13=(CyL5tHox@Z-rfB`(fj#fK$o>SY2Ji)aMgX z=MSbYy87{n(+^#^V*3em7O#h0^}EQ7hD68=aU$v8RaeDO88;$N6W_1mwTgr(_u4fm zAvFm5u(!^h#DIVf0ZP>7qSfLi7(9K2N45G#1u60?aYXeUDC?sI#@DEtmmen3* zQrbdJn}ah(Lgb{hEXf#{Mu9&)>qz;? z9p`sM#9a>4T(*YV@7OgqWl&u?9dW_mU!1*o%gG?J76BOu03baNjvNJ@ze6~YvtbM|UdtS!xzJ7Be@z6W400SUUK zrn6<(5p*i)xpCC z{a@nrF;n_>iOxdAwBs;{wY9{Hi$UzE5?4zbrKYBaIkW#F8Zn@$Id}3S&(AvI{2LxF zUA$^{$AzmlLvy-`LgA2%w=LjO2tx?rFw@ah>I{tUD6Q)Nvf&0zkZy$!&?27?)m|p5 z1ZGfObQn6xgoJ>NDCU8p6hLzFb7TK7^dC>Yp$LL+mf{?+zPSnoewxdBK+m%Q0e~4u zmXI=?5kQvUu~?KB6h!#8?OP!h36Ug@KJP;z0RnjtFes)cx_6o@kLnK#N@6S?H^jeR zoQ~^uq$d#3I7G}iypGl+;5%};{r{$>+YV~iuKfv34J&0~LD-O%u-74jK%2`sdxE|n zsu3k9gjvit+iK?!@D}H7Rm;+-RnwqmPY`+0`%wa?B>Xu5eqM{<1OjiBZ*Q>3qb(ION zkcqHnn>^x~i60$z;f;@8vSxErpT(=T!R9TS0Z0Hau(%lpGZtcDW}+>XE`i8kK*Wfo z-==fOSI)g8L<0~E03c}2HH(I(2HGeEpSxyjc7TV^(iL^QnY_GjOG>%&D|Ls2dOfZJ|W z!62?&Qjq}AJg_l8xAfSxOxq+LG^X0dpeofH$TA%NE+nQ!M8<5eHj~Ln(VR258D)LC zb%xQy`!^0B-2LV8N00bq#Nh6gh}d{@8FK*nH3G27>|az5R#Kngpx@YstKAG0Z6C)LR#y@^DI!| zes8iu`oUYBerVx~)L&0(2b`XCG2O%m2$1{{Ls0Ml>8=fiS~>vAL8=P#pu_L*-lS83 zt7C?Y+aEof$yp>UQ`F}$-nIiD)UPWH>eIQYd&fv!CX=4Ee0|5?Oq;VDBPNs5#X*A# z2-0UA`a~%LsSvwB`$TS1z<9*8eSJ!3BW)1io;!!2~vbZOvVes21r0jU=RR+ z5Fjm~nuFw#xZV5boMHB0u7kEQ0D~DELd*bUoPcrKy1QO%*tVU2ykKQP$98Qlc@ zpyBq*d@(* zLuGsiG+vKhc#}^!Qq7OFsy86{tF{3^sepYEhZZb>Roh+FvCk7B3Vt@wj8k0oHC+*q z^7Q}Jgn|QtC8fv-0+F>i0Ai2sUCjbR!hs_PX9o7~I%Uj=e$!4la$sdF8s6HR&cd`$ zSAP1dzfF3+Zu(+~$D@*@SMz~NYeXga^6gs#g&i_b*$PAijG3&yai{hC8=sZz)4hY6 z1Y})^wlxHQH?9G_Iv&4uR|6Q_R>%a@XZE#L7HI+&+PG~1+|S<+ip02zsHsRBApvIq z+2&?r=;%)J;xi9<@MlC=4j`cHzgy>(RaF@PkbCj%&wladv?UQ{l4a#`M!xWmyF2X{ z&NQcGx2_%ekbzwvK*UvvL^c1<2}g=0lSxq!55tt1D{r~^&l9e%owmIDqLrJVF_#6? z3|Y~L!HFa%l3Yl|T@;w2;i8;Uy4k0f+y_NCNHujK0Fn|x5^@B_LkKJ!ruuZf_+-g; z{A9t(_AgES{QSo!e3ZEP&R3p4_2_~3j2SU#HX>##9Q5Lw;^+Jz5&&n`pTpD|>#S=Y z`ul^=ez>oNR?gte1SxeX_dp;BlI;9ezS28$^X34lMzz>fN7hi0Zb2oG`8xg#2stp$ zfBACS)v8V}aH`b4TlYwX?#=EyKfPMOQvqly5-rTEi&+36a3tu?t$bA>YqvqzO zw71Xk;?$$zLl5XT;hC2|Ig7xUFm={q8IOeAHe?H(s=!#H^7p=`0`rqmu=|(caM;+g zbDMSFGt)}Cb}D?8h>kBSt3o2OT9bfp_j2a{@sAI@aaJ~)^ZBi+>LjUxV!C(_f{tqW z9H(G{t_VyikF$X}sS^zeAZO*QcI`SCqek?5x*!B|N0(I@GpqjlIB6Iux$&mkt55rI=3I~*tw=!(qeh4kfgwdsJ1+d9LIwa^skc=y|Camb7q-;j z^bk-Y0zrTrxe<$U;GEH}bfbKG))I5(imm6pGWGMs$wv)YH*Lo9e~cN`zY-BM0D#ri z)okziTtDCh01=S^Siimd<-b=>m~mr{a>6v2NzS~qD~REmNaQt_Q5VdGk_3fPLj+uXAEwbtZRq1tY?Sr(64)&MTd+U^7e5@41Hwyz;=rf zv7rp|Abwd=vUl)oV1$nxn7`ND?p*LbV$b2>LAtO})zhPZ+*B_7|++2@nFVWdtCd4U33@F~1<000I*Rf$=6)=%?a>L(Jbv_~gNOC|c-%<`JQ=fD!Q0hOukbhMv5HI6rInTD zdE*YA_(I+MGsS~q!uzupQ$gGWA?;6!3KP}$08qqRob~HlCX;tq*`HT}6bR91*jT=P zt@X!;>q?ews6V@^s_fYv-PeZzAln*-zrAa!y(VeI_}^`{EMX&sdU(`OF$kDo+4To0 z?MPpCniSs&Q1v*12{bBu0~j!d(AbdXhmYI`etpAfe?&w|rAW+#|6Yu2*igj*Aotq) z3vYbuqh%2m;T8xoT#sLJ=6X?aGeRK9WwNqk$9DX{qTUY_B5oQxHf7XItq_4Y07SoK zH8n{=L!E`PLNa8W@o2<^rfjpAzqZ+!|HKD0b&(WiM{9^8+4SzdiWZ!=# zlSu)o6oZP2udO}zy-xt#!1(NIv;OwG``)>6!=}x-Sky4d(N%BBOvlTb2^=UM{1Gp$ zs3Il6p+2ey>S&+8h+Jsc%f87TT>(VMSyD7Nrx_1LSckR+Y+#?x(64K3!C@o!dB5a{ z5f2pgYqt~;8{F3~t(;+YUq4Eem+w8q-%_<74I9vu&h>om_1RZl`}+xHv*vB+G<(4+ zXwGIR5($ZT)Z|i1gL0M^lu4bDLth{XJt{kZX2YfG=#wHYLeN705(40)n;--{{ZuPc zwQ5&%{-wiy_8rplUCc;zSX91kR20-aUj|hS$Yb9J0>45gu-yfPf*eU8K_X;E_;H5~ zpYo4e&p1;pTh#B^ITSRgud1vpS6W(Wo?bj;($g<|covHEg!kvHpm;n=QWEng0MygU zAwfES;ZBU(g93_!8u~|;v?LV7qkQ4Al~&E`^z?(zOv_$*-k}pqD`%KhWuse#g1#+e zv%FkV9d$kQ+`kXBvfC(RqQ*aKiMJo*ws^rxNv4q~5SUu3tlVVVQ5OXpz06s{>fEst zJN4)hPZa_zDlM%vD=P56t`SP57*>>7MAYlr@@KDFylgeZ+D5p@Ne3O(TZ!&j!5Ei7 zz$5)7=WM$7`tnIfUHOwE{@%A++mED+q=sz?sa9(m%z3;*@h zj9)C6zc>@`5DN=S`m@jg`WPOxFn_Ic(j3@~?5QdZWmZkr88EPgXdsZ`0T6Io6;4_L zsJSW2AZKBR&K-Eqe(j-G*EVxY#ti;={0T?hJGfV986r0N0in|DzJ9$ZFE1xoiE3{H zf53uQ5K*6H8+MmG_5AynpLpS2`!C+GyW@)0n*bQ*V(~DK$HR;S8B$0E0;2%5NV?bz z_;9_d{}GhS_24m7W%&M6&p;g=R9=TrpRf16F$OL9{*m(>re^laG>A7d4Zh$mB7jt^ zco8w*NGNy@g5oLO_#FX5LSYHox+~jR617d(MX}U06_*eaV^NdOU%rYSoy;dp zdS&L>XPh!>LS^L)v#d1<_@7@jHNc>vLe&4_*8RG6?oyOXFBOq+j0>3;X_Vf-3Upy! z|IIV9vlF2Prf+) z##cXB5@iv?5<(ijI0h=`j>|h>kdq_}+qO5(K5@*<0|s{AJT_Hp)KvJ@ziaeHM4`tg zef(_cubvzK>5_FE4Q>?{6mZM3xCCd-L%wsWYS5Lxi$RxgSDq8J+qScRMe9XNrX~Lj6_U^5k_xK`^1_tZ|T`H7OXzw@fW90xZu>$7b9XC5($paKQH!B zcjG27xjsVCzDC2si~34WKx6-giKEMo%r_LE3f~4r7Km2v2L~o)R(v>X`G}vD zPr9h)uH=2mHr1h;isT-{>n;-TlQRx~;gRYO&wi+eKmXC(l@O0bq?D4WlBwQNPP&%@ zD#@__Vf=&)2|yBJG-ARhpDvYEv1rYL#p@IM59%>tPv^T^udg))004kVug}V^TDOHD zWO@T1I%?(+Y?VUBH!=&1;kaubTA&RCk_1pSQV;-;LsN5B>_4bKKmC{yzce^sxTotP zl}fSsMeQY3Qtvaa`M=T?Yd2FQYI11_53SNkw)XQlXOQ0Az($Pd3m1$(?7?4MX=e#o z;W-KNWHM>3-L~zp3vYeuws${Xee#-3>nUCkCXiqV$85}o<8^-n^{DWR6HwZB9uSg; z_~nss0^`HFcZu)uqWN{8a&|JsFwSWcpd^q47;jr(W+*4#`gj4Kvvf=HlTX(iykz;N zEB77H^$l{ITlbb5@V!g`QYm5;C1?@R;PF>KR5x$=x^6MsV}_~i+Pt#I=_k490AZj< z>?y2~mf=yLhwKadFh}x7$ZR$XqOlQqG|D>^7DCa;-q52j99gXv}0` z!$cBbSNj2BB5hGKrz!$ld+vYyz1=_i$&rtzQYoXNqGFHPy)F`PS@N(+|2OfI zgz>yl^WmIT5RI55MGgTe--7^ju_fPlC^#wLlOBZy7>|eOwRh)Gx6W;=(`h;@62TWz zsam6=qE#*Me~1780KmJmSF)`;>(L<%`|UV2K_|U??WMj%`GK7RE}H=q3zZ7j-_r~T znc$q^h2usoI^l?Y?-cTOwx@Id8#eUdH5JL+Z~r#=hL1kq5I4i704X>_yXyDRD>x z2*8q-h()99;GzBB>C>a_JIQ2?+v7*46=%Kt{*u#f`28!BUU_#u=B%6*FNkny2}HG} zkat$;Fcq&K%Pnkm+m|q!2t7HhKHDaTs}65p?fdFmufCeP$nb zlvEwFgO7KVC>kGQCwUu-Jbqe3Hol|tEQ&LbGV8{P1xSlbnbZ8rcf`S4t%rLB6zYDhQYLt;^h)LHlS5YT}fWVVCO6_?S_#h%VrI;jySj^yy zR;`f}-=6!}%ukoor~?K(@ntLPsxmtX`01GkPkd(bdkKzI^ZutRDH<_A+RQ+Y&*B|a zq|7gClGWgIIRXt7DS*WaLgMLHK4F=x^=Be_4H2_nSMRa)+VkuEPnTpG(^)VW`cSo^ zC*rp*N!?=lzHR}<($=X~0H8m%>+WF#skxy6&p7TN_Up1^PjXcJ_GnbpSu?p0KU;O| zwW*0$Y~HzBL`{RaJJWYFRg)13oFOzeG~4Hq_<#D<&hBt zuut%5RBi>~SkI%=xzVZ4?;`je7eCxqy-|xl@vJjaeyrP1DK<_NR3U^8pU>{4~S?@omv53 zA?7>Pehns*N$Ca-A{sbn*|y;mU;glx3$JY?F)8i- z8DujVAj<-fgrRr==ZFw9Oekzy0BzzX^z7OR!eO}?q@2~KM<+aZ4!=@>P^ZHT-aXj5g)zdIQXXYL~9SI}^2^^zw6Y6Fzk*R;O zJLcBToiwxr8@{aYj@u46@3bQ)RzCkuG9&4^kLN6dSi~SHBvWD3mXJzytU1VM^yrR+ zfPkE#B_>Y!bntmMvdKhrnxhfWDiriTyl%bxgr8sk*BAXLp#)3P3RfpV@K}PR$!Md` z%2i{Sf_kD-@VH(Wb~4@6kQV)WbTyJE9`GB(;47-DiSLQ%4b4ON_o%*%iE>|YkH z*;x=aL69W$ktZK9L?r+Vi6R`1u>A*itvz;hulL7}O&N7{bx=`JB8Vvb*Qz%sJz72E zgoW$Y%XmBnQdkDLGx?}$j_7jV8ock`GxeVouMicbggjtPDoCVq`XOrV1`iP+$aA3e ziRV5N>i!!tcQhHjEI~>EAb~}rCaqq-%38mE?P=L`ZrocREIaME!||0bYwY#CN&pa( z453Ec_@@bfx$DUfdgUly(4u{-PAnNXr%MDEKMnvFc|kvA6qlFFaz~(N>Q}7v z-JoAn22=-PYrtpFHc7Yf{f&{K?$a?LJ$y1~Sdf!iYz}408-g&WXqq4pH^L z{mPG8v=ddw?L5fcuXpo^l{ymO{u|{X{-}H(iUp$%Q2U<8o{ob1nw$X$NsrPrb8!EzO(!3B2l-Brk<0{isxp1z64`YQ%YhC6nDXZp_-Q% zqY8Hh+BE1U0nFf%a@Le-i%+=iudlv9M5jAyfvrM8|D!9@ob4|yp?hnnqn`kZ&vdYe zCC7<0s22dfd!*K{4x(=aQf5Uw#Er7#p-V4I9QsEgZfD6og#NF%;z6^jsw_9=q!IT_ z`FQDp&CNS1vi{vHvnd+vEPTvAe!A)@f* zzj1spwC8x_ zOJx*F7d*ot3~% zBNC4CuASS#z@D9;Ti1@$`*x3iFnrX|7tSx~zX=f+s?dIyE=80`03;F#iHO$JiVFA& zg}&!aolMrCnrRc!piky*xOVbevkv*mjZYsmXTe(7yln>%BP$vUv3MlLrLfIFbh%tz zg)e9cs?D-0aFy4BCw=Zn?;Gl;4rz1ny77)W!jwk~(8ibSpTju^NtPr@l+9$o%I3(3 z#EfvrfQ}v8z@R=|pnZV}gvQii`*vgfy0_cDGn@OzQ3vf0!v=NEh7mt{{fln$*pvZX zifHVRdDx|>h@b`lG(pS0V91cp=)jA~O*?i~Kl9q0Gk5RWDL6+?$_St;9HMF!kTYTA znjWc5d@=3r9^ZE-$Pq_Q>sppsmKKJqL z#Tbu%{Ke+PpwSXN@ka%C!mw z{co;yn|5Y|6rhRo0BF^tI+>z2+I)^6wRFg6@gB9+;jUXL(~UW}@XSM&-+JXq$IN`^ zNnTx@pgsBCT_1zDKU#Y9Eq{LQ($(wNiAX$RNQG>y6&ubT0ZAZHif|~#2lQndLLbkoTW3{fwaPrR{_1r^W4~8J$%>|Ul zqJAbTfnD89t~ZI)g_*!d|I~xcwKP{X1oFt3V<%Nmrs(@70L3UHTN;j z;X*=K)ZElShG7^6XVANQ7Z}{HJG6=M`C|_oy35Mu{(WM}sO5wD6zoRCPbRi_M-v

hz-oi8tgKyosF8k=j508vTWNAf3$(H$qm!nc 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

u2Hs=#&|%3_NUc9xO%ek60R=S#4Qy#f>~k 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 literal 0 HcmV?d00001 diff --git a/assets/beep-icon.svg b/assets/beep-icon.svg new file mode 100755 index 0000000..28b2eb2 --- /dev/null +++ b/assets/beep-icon.svg @@ -0,0 +1 @@ +AABCHWp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAAEH3anVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo4MGE1OWIzZC01OGVjLTRjMGQtOGZlOS0wOGE5MDU2OGM0MDQAAAAB5Gp1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAAO5qdW1iAAAAQWp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuYWN0aW9ucy52MgAAAAAYYzJzaK8iyp4YHAycjjlIX9Ee9rYAAAClY2JvcqFnYWN0aW9uc4GjZmFjdGlvbmxjMnBhLmNyZWF0ZWRtc29mdHdhcmVBZ2VudGhDYW52YSBBSXFkaWdpdGFsU291cmNlVHlwZXhTaHR0cDovL2N2LmlwdGMub3JnL25ld3Njb2Rlcy9kaWdpdGFsc291cmNldHlwZS9jb21wb3NpdGVXaXRoVHJhaW5lZEFsZ29yaXRobWljTWVkaWEAAADFanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaAhdhKaZhalgTl+LaOUx7zkAAAB9Y2JvcqVqZXhjbHVzaW9uc4GiZXN0YXJ0GQEPZmxlbmd0aBlYKGRuYW1lbmp1bWJmIG1hbmlmZXN0Y2FsZ2ZzaGEyNTZkaGFzaFggIFCd6gk7Z17bAjGodcXn7W9opkvaQsuCAjqOTmGwESdjcGFkSQAAAAAAAAAAAAAAAgtqdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAAB3GNib3Knamluc3RhbmNlSUR4LHhtcDppaWQ6MjdmNWQyNDYtMWY5NS00MmNlLTgzZjQtZGE3NGUwYTYwYWFhdGNsYWltX2dlbmVyYXRvcl9pbmZvo2RuYW1lZ2MycGEtcnNndmVyc2lvbmUwLjAuMHdvcmcuY29udGVudGF1dGguYzJwYV9yc2UwLjAuMGlzaWduYXR1cmV4TXNlbGYjanVtYmY9L2MycGEvdXJuOmMycGE6ODBhNTliM2QtNThlYy00YzBkLThmZTktMDhhOTA1NjhjNDA0L2MycGEuc2lnbmF0dXJlcmNyZWF0ZWRfYXNzZXJ0aW9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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2WQIAW89+2EaFY4NtWFf49xafNL2ZjVjdVmrgY2jGQaEYoc6NnOLSV/fr+onREooWoo2PCTAmGH/Uk0J2Eu1oTdfruN66h90qN0zfETgNLKOLh7M7GpSiN9GoP8VY5J9nw9OT2TC0vE/Yu5Oun8cSsIe11e8/CUGkPEuZc+AqBFyCPdzO2hOyXVfbEN3vv8E61InLGnKW8kdS2bZHYlg0lVZi0RGzWOt4EOwbLGYo7GbhEGQDaTAfoRaQtw4vx4oLr6YLzEOIy5tZedpZdhKfXLWOa7unpxQPMlL3L+i+RezjuwHCbdSlMVkVAHH2ORphpT9BaCJayZJapm+GoFnLEkG/rgYrEE0Tdh0tnl8SYURbpbZkHu3BBi7dPaxgeFDHeUjpUTXRyhCwWHxbDdg+K8KeEmanV+h9jNrruEuH+Kdbh349enxpmRZ/dHHVAe2Czk775hN9RPJDhND0Wuz+sCpreEXt4VsR/loZWG8LZg556vOGOQetydI55fvLuY1iynRXIa1lslBEzEluQisqmS0nU686zpsyHbrcMpOkUbuVklosyRBGYIrmy8CirZ5TPbZ/yrjjRX2hU7T34Ia1kbbqJB58gF2ylxmOOeWTgvuVjs0mzcXgUUX3mFAKdOyyFw0pNuvjK4WIXtO7XSxVzy4rtqHUUcTQiHfULisFUGc4YEY=Yes \ No newline at end of file diff --git a/assets/beep-logo.png b/assets/beep-logo.png new file mode 100755 index 0000000000000000000000000000000000000000..2418e8d9bbe34902b418ec741b5bcd83a000286c GIT binary patch literal 3013 zcmeH`|1;Zn9LL|L*oww>J=z+kP35#Tu4~1&*q2g*lp>7~t7(qws4t0cRm8N0YB^yt zU$c>J=Q~##6)9aO?!!<_GG8L=d|N^UX(SPm#diG@`or$L?q2u2d%o^o_j)~E_bLdu z;$?jJ#9;t{G1}WB5CEOm`)Q)Db*e7wLR$IghIb$afOH!GvhM+~qqVaC1|Zo108s=0 zF5d%SmQdYu)lFN_kM#BO(5g0+msk|7yqDmOCj;|dG=Uq8YH1Ho(3X4%R_oc zZxnQ80AOf?_V_$FZALsz$rmK+3~usPRO)##m!Bd~zkI~6WICK4_FRpC=iKe_*)92C z%?fX4ZGANaLue-5Gs$T+!kfT4_x|0nr%!qIZeFwF@!0tq zvjJvd6P5F1Dq5gY5}|_i^0RWdFVC1Azd(j2XgG-&MPD3|!cyF;s!=Fsaz;#GY>Xd) zi_uT*q%q})Onc+eaMB&BYC@$W_rwYK*Cqb&-|%tf?yfUpt0Ol^yRMu zKgs@}!Vqc|&+YN61!!Z;fLG)P&kUM)?L|~xsDO}q#x^={ zyECiiH}Q#`aHaQz>TBt@Oc^2)TWpTrufb{*0es&#cR$br0&jtU zX=&ZMPT`A|vrY3CW|7Y#rIqw#`mx;^gZRGn9^wXT1=-Sl3QCiNwfNf%1YfSqE6uPS zD<7mPaiq>vmx}4cIQd#Dae0{BcYMAw$-k41N_2-Vw#B(-p{X@em5ZcJRo&0RNyi)W zkhsjPZ~ptfE|F!s6CwN>dud$>^P@Y5pUa4h+UVjK+QT1SZ=I8uG%z~q;#EWDrJSH8 z&Q=ja=A*edylta#+bu5Mw!^rXBieQ*114sf2@;4!{Sbwci`eK;X?;x;e?@m*9U9ZP zcPn}dv1)k;^y@9d(y2tnqed|XJ1p5AABCHWp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAAEH3anVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo2MWNjMjE1ZC04ZTZjLTRjMGQtYWEyNS1kNmY0ZTY0OWIxMGQAAAAB5Gp1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAAO5qdW1iAAAAQWp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuYWN0aW9ucy52MgAAAAAYYzJzaDuUJpf8gX3AOI+dKFeIe9cAAAClY2JvcqFnYWN0aW9uc4GjZmFjdGlvbmxjMnBhLmNyZWF0ZWRtc29mdHdhcmVBZ2VudGhDYW52YSBBSXFkaWdpdGFsU291cmNlVHlwZXhTaHR0cDovL2N2LmlwdGMub3JnL25ld3Njb2Rlcy9kaWdpdGFsc291cmNldHlwZS9jb21wb3NpdGVXaXRoVHJhaW5lZEFsZ29yaXRobWljTWVkaWEAAADFanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaHsl4ugwsbssLQOELklP0JkAAAB9Y2JvcqVqZXhjbHVzaW9uc4GiZXN0YXJ0GQEPZmxlbmd0aBlYKGRuYW1lbmp1bWJmIG1hbmlmZXN0Y2FsZ2ZzaGEyNTZkaGFzaFggbSbE/DmoDKtYqNhKADyJkeRdj3A+ABERW5NpKh5mFl5jcGFkSQAAAAAAAAAAAAAAAgtqdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAAB3GNib3Knamluc3RhbmNlSUR4LHhtcDppaWQ6ZjdjNDhiNWUtNTM3NC00NjQ0LWI0ODctN2EwNzcxNjIzYTIzdGNsYWltX2dlbmVyYXRvcl9pbmZvo2RuYW1lZ2MycGEtcnNndmVyc2lvbmUwLjAuMHdvcmcuY29udGVudGF1dGguYzJwYV9yc2UwLjAuMGlzaWduYXR1cmV4TXNlbGYjanVtYmY9L2MycGEvdXJuOmMycGE6NjFjYzIxNWQtOGU2Yy00YzBkLWFhMjUtZDZmNGU2NDliMTBkL2MycGEuc2lnbmF0dXJlcmNyZWF0ZWRfYXNzZXJ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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2WQIAtuRdGCUbntEbvZIapFlfdXJsXaUCKfgP5iFKizSBmOUEAt/XHChlgMAmHDLHUS9salP8PLTK1+fnpFxBYiWsu8H23yKlqdz+64qzO8CHI2jMY+cdUMFxyolvc53tdV+jwdt4yaktidEj+IEAP31vpykomfe30fSHv9Qi2Eg4a7BQwpW/58q7R0wW/mHE4iQ3pvODT4LiKBzjW6WZHGqBj4Dl8aPtptYa4YpaKQOIAxFSeXF8erNKTorFXH8Z9jGOWjeSO1GqLYz6chI1E+3E38grLN6plqYnlbh/EckgxtZOvUgrdwT8xbpr5i/XHqRJ1o9IbDsRbCNpZZtki6w/7I8t/gVqjGeJbwW0aYxfJSgeuo4gxasOcoBaW6v2NFmOcXFTOwv9UpmUXGudL2IRIKZoHJlpclKn8gkWou89ssoxZFN9v1SuFWbaGfhIt45nBKBqB69i+wSvMBNVbJy8pp8FDwDMdPhsXK4Eujfv5t4Xk/6fFblnqyaNVexVF83/g6594u1LPDt+BzjkwoOsKiFk+N7Tf9KbeU+hK6dDWslGfcr3sI/RHDD/wTwc5fZv6xkksXjb0fAflm5ezuc1q5bhiMjaKHx1EZpIPg3/bPGJxrbRd4FOzib5Bse9t0c3kXCXcPRkHJE8d1tUIrN3/IMJZxgxvHw/SJsZA1ETiCg=Yes \ No newline at end of file diff --git a/assets/beep-wordmark-blue.png b/assets/beep-wordmark-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb721d01ddd9548a6ac89cbe7e24962d73f7c51 GIT binary patch literal 17536 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

tDq23+l*bbJwVvtAiTVz=l7*4E|u@*01E3P( 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 D-Y>)I literal 0 HcmV?d00001 diff --git a/assets/beep-wordmark.png b/assets/beep-wordmark.png new file mode 100755 index 0000000000000000000000000000000000000000..018edcd2c1929a8addd0f10928c832160381202b GIT binary patch literal 17492 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

#)A>&B$0b!qc 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

'; + } + if (sentinel) list.appendChild(sentinel); + feedState.hasMore = !!data.has_more; + feedState.offset = data.offset || 50; + list.classList.remove('beep-loading'); + }) + .catch(function () { + list.classList.remove('beep-loading'); + }); + } + + function emptyIcon() { + return ''; + } + + /* ---------- Click delegation ---------- */ + function onClick(e) { + var t = e.target; + + var likePost = t.closest('[data-beep-like-post]'); + if (likePost) { e.preventDefault(); if (requireLogin()) handleLike(likePost, 'like/' + likePost.dataset.beepLikePost); return; } + + var likeReply = t.closest('[data-beep-like-reply]'); + if (likeReply) { e.preventDefault(); if (requireLogin()) handleLike(likeReply, 'reply-like/' + likeReply.dataset.beepLikeReply); return; } + + var replyToggle = t.closest('[data-beep-toggle-reply]'); + if (replyToggle) { + e.preventDefault(); + if (!requireLogin()) return; + var container = replyToggle.closest('[data-beep-post], [data-beep-reply]'); + if (!container) return; + var form = container.querySelector(':scope > .beep-post-body > [data-beep-reply-form], :scope > .beep-reply-body > [data-beep-reply-form]'); + if (!form) return; + form.hidden = !form.hidden; + if (!form.hidden) { + var ta = form.querySelector('textarea'); + if (ta) ta.focus(); + } + return; + } + + var replyBtn = t.closest('[data-beep-reply-submit]'); + if (replyBtn) { e.preventDefault(); handleReplySubmit(replyBtn); return; } + + var shareBtn = t.closest('[data-beep-share]'); + if (shareBtn) { e.preventDefault(); handleShare(shareBtn); return; } + + var delPost = t.closest('[data-beep-delete]'); + if (delPost) { + e.preventDefault(); + handleDeleteWithUndo('delete/' + delPost.dataset.beepDelete, '[data-beep-post="' + delPost.dataset.beepDelete + '"]', 'beep'); + return; + } + + var delReply = t.closest('[data-beep-delete-reply]'); + if (delReply) { + e.preventDefault(); + handleDeleteWithUndo('delete-reply/' + delReply.dataset.beepDeleteReply, '[data-beep-reply="' + delReply.dataset.beepDeleteReply + '"]', 'reply'); + return; + } + + // Thread / conversation view + var threadBtn = t.closest('[data-beep-thread]'); + if (threadBtn) { e.preventDefault(); openThread(threadBtn.dataset.beepThread); return; } + + // Thread modal close + var threadClose = t.closest('[data-beep-thread-close]'); + if (threadClose) { e.preventDefault(); closeThread(); return; } + + // Quote button - open composer with quoted beep pre-loaded + var quoteBtn = t.closest('[data-beep-quote]'); + if (quoteBtn) { e.preventDefault(); openComposerWithQuote(quoteBtn.dataset.beepQuote); return; } + + // Quote composer tab toggle + var quoteComposerBtn = t.closest('[data-beep-quote-composer-btn]'); + if (quoteComposerBtn) { + e.preventDefault(); + var compose = quoteComposerBtn.closest('[data-beep-compose]'); + var quoteSection = compose && compose.querySelector('[data-beep-compose-quote]'); + if (quoteSection) quoteSection.hidden = !quoteSection.hidden; + return; + } + + // Quote lookup - Add button + var quoteLookupBtn = t.closest('[data-beep-quote-lookup-btn]'); + if (quoteLookupBtn) { + e.preventDefault(); + var compose = quoteLookupBtn.closest('[data-beep-compose]'); + var input = compose && compose.querySelector('[data-beep-quote-lookup]'); + var query = input ? input.value.trim() : ''; + if (!query) return; + fetch(config.restUrl + 'lookup?q=' + encodeURIComponent(query), { + headers: { 'X-WP-Nonce': config.nonce }, + credentials: 'same-origin' + }) + .then(handleResponse) + .then(function(quoted) { + if (compose) { + compose._beepQuotedPost = { id: quoted.id, data: quoted }; + showQuotePreview(compose, quoted); + } + }) + .catch(function() { showToast('Beep not found.', 'error'); }); + return; + } + + // Quote remove button + var quoteRemoveBtn = t.closest('[data-beep-quote-remove]'); + if (quoteRemoveBtn) { e.preventDefault(); var compose = quoteRemoveBtn.closest('[data-beep-compose]'); clearQuotePreview(compose); return; } + + // GIF picker button + var gifBtn = t.closest('[data-beep-gif-btn]'); + if (gifBtn) { e.preventDefault(); var compose = gifBtn.closest('[data-beep-compose]'); openGifPicker(compose); return; } + + // GIF modal close + var gifClose = t.closest('[data-beep-gif-close]'); + if (gifClose) { e.preventDefault(); closeGifPicker(); return; } + + // GIF search on Enter (handled in keydown) + // GIF search button + var gifSearchBtn = t.closest('[data-beep-gif-search-btn]'); + if (gifSearchBtn) { + e.preventDefault(); + var compose = gifSearchBtn.closest('[data-beep-compose]') || document.querySelector('[data-beep-compose]'); + var input = gifSearchBtn.closest('.beep-gif-search-bar') && gifSearchBtn.closest('.beep-gif-search-bar').querySelector('[data-beep-gif-search]'); + if (input) searchGifs(input.value, compose); + return; + } + + // GIF remove + var gifRemoveBtn = t.closest('[data-beep-gif-remove]'); + if (gifRemoveBtn) { + e.preventDefault(); + var compose = gifRemoveBtn.closest('[data-beep-compose]'); + if (compose) { + compose._beepGifUrl = null; + var preview = compose.querySelector('[data-beep-gif-preview]'); + if (preview) { preview.innerHTML = ''; preview.hidden = true; } + } + return; + } + + // Poll button - toggle poll section + var pollBtn = t.closest('[data-beep-poll-btn]'); + if (pollBtn) { + e.preventDefault(); + var compose = pollBtn.closest('[data-beep-compose]'); + if (compose) openPollSection(compose); + return; + } + + // Poll add option + var pollAddOptionBtn = t.closest('[data-beep-poll-add-option]'); + if (pollAddOptionBtn) { + e.preventDefault(); + var compose = pollAddOptionBtn.closest('[data-beep-compose]'); + if (compose) addPollOption(compose); + return; + } + + // Poll remove option + var pollRemoveOptionBtn = t.closest('[data-beep-poll-remove-option]'); + if (pollRemoveOptionBtn) { + e.preventDefault(); + var compose = pollRemoveOptionBtn.closest('[data-beep-compose]'); + if (compose) removePollOption(compose); + return; + } + + // Poll remove + var pollRemoveBtn = t.closest('[data-beep-poll-remove]'); + if (pollRemoveBtn) { + e.preventDefault(); + var compose = pollRemoveBtn.closest('[data-beep-compose]'); + if (compose) clearPoll(compose); + return; + } + + // Poll vote button + var pollVoteBtn = t.closest('[data-beep-poll-vote]'); + if (pollVoteBtn) { + e.preventDefault(); + if (requireLogin()) handlePollVote(pollVoteBtn); + return; + } + + // Image lightbox - click on post images to view full size + var lightboxImg = t.closest('[data-beep-lightbox]'); + if (lightboxImg) { + e.preventDefault(); + openLightbox(lightboxImg.href || lightboxImg.querySelector('img').src); + return; + } + + // Lightbox close + var lightboxClose = t.closest('.beep-lightbox'); + if (lightboxClose) { + closeLightbox(); + return; + } + } + + function onInput(e) { + var input = e.target.closest('.beep-reply-input, .beep-compose-input'); + if (!input) return; + autosize(input); + var counter = input.parentElement.querySelector('.beep-char-counter'); + var submit = input.parentElement.querySelector('.beep-button'); + if (counter) { + var remaining = limit - countChars(input.value); + counter.textContent = remaining; + counter.classList.toggle('beep-counter-warn', remaining < 20 && remaining >= 0); + counter.classList.toggle('beep-counter-bad', remaining < 0); + if (submit) submit.disabled = input.value.trim() === '' || remaining < 0; + } + } + + function onKeydown(e) { + if (!((e.metaKey || e.ctrlKey) && e.key === 'Enter')) return; + var input = e.target.closest('textarea'); + if (!input) return; + var wrap = input.closest('.beep-compose, .beep-reply-form'); + if (!wrap) return; + var btn = wrap.querySelector('button'); + if (btn && !btn.disabled) btn.click(); + } + + /* ---------- Like (works for both posts and replies) ---------- */ + function handleLike(btn, urlFragment) { + var countEl = btn.querySelector('[data-beep-like-count]'); + var was = btn.classList.contains('is-liked'); + + btn.classList.toggle('is-liked'); + if (!was) { + btn.classList.add('beep-just-liked'); + setTimeout(function () { btn.classList.remove('beep-just-liked'); }, 600); + } + if (countEl) { + var current = parseInt(countEl.textContent, 10) || 0; + var optimistic = current + (was ? -1 : 1); + countEl.textContent = optimistic > 0 ? optimistic : ''; + } + + fetch(config.restUrl + urlFragment, { + method: 'POST', + headers: { 'X-WP-Nonce': config.nonce }, + credentials: 'same-origin' + }) + .then(handleResponse) + .then(function (data) { + if (countEl) countEl.textContent = data.count > 0 ? data.count : ''; + btn.classList.toggle('is-liked', !!data.liked); + }) + .catch(function () { + btn.classList.toggle('is-liked', was); + }); + } + + /* ---------- Reply submit (top-level or nested) ---------- */ + function handleReplySubmit(btn) { + var postId = btn.dataset.beepReplySubmit; + var parent = btn.dataset.beepReplyParent || '0'; + var form = btn.closest('[data-beep-reply-form]'); + var input = form && form.querySelector('textarea'); + if (!input) return; + var content = input.value.trim(); + if (!content) return; + btn.disabled = true; + + fetch(config.restUrl + 'reply/' + postId, { + method: 'POST', + headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': config.nonce }, + credentials: 'same-origin', + body: JSON.stringify({ content: content, parent: parseInt(parent, 10) || 0 }) + }) + .then(handleResponse) + .then(function (data) { + if (data.pending) { + form.innerHTML = '
Reply submitted, awaiting moderation.
'; + return; + } + // Reload the full feed to get the properly rendered reply + var feed = btn.closest('[data-beep-feed]'); + if (feed) { + reloadFeed(feed, 'latest'); + } + }) + .catch(function () { + showToast('Could not post reply. Please try again.', 'error'); + }) + .finally(function () { btn.disabled = false; }); + } + + /* ---------- Share (copy link) ---------- */ + function handleShare(btn) { + var url = btn.dataset.beepShare; + if (!url || !navigator.clipboard) return; + navigator.clipboard.writeText(url).then(function () { + showToast('Link copied to clipboard', 'success'); + }); + } + + /* ---------- Delete with undo toast ---------- */ + function handleDeleteWithUndo(pathFragment, selector, type) { + var el = document.querySelector(selector); + if (!el) return; + + // Store original state + var parent = el.parentNode; + var nextSibling = el.nextSibling; + + // Hide the element with animation + el.style.transition = 'opacity 0.3s ease, max-height 0.3s ease'; + el.style.opacity = '0'; + el.style.maxHeight = '0'; + el.style.overflow = 'hidden'; + + // Show undo toast + var toast = document.createElement('div'); + toast.className = 'beep-toast beep-toast-undo'; + toast.innerHTML = '' + (type === 'beep' ? 'Beep' : 'Reply') + ' deleted.'; + document.body.appendChild(toast); + + // Trigger animation + requestAnimationFrame(function() { + toast.classList.add('beep-toast-visible'); + }); + + var deleteTimeout = setTimeout(function() { + // Actually delete + fetch(config.restUrl + pathFragment, { + method: 'DELETE', + headers: { 'X-WP-Nonce': config.nonce }, + credentials: 'same-origin' + }) + .then(handleResponse) + .then(function () { + if (el && el.parentNode) el.remove(); + }) + .catch(function () { + // Restore on failure + restoreElement(el, parent, nextSibling); + showToast('Could not delete.', 'error'); + }); + dismissToast(toast); + }, 4000); + + // Undo button + toast.querySelector('.beep-toast-undo-btn').addEventListener('click', function() { + clearTimeout(deleteTimeout); + restoreElement(el, parent, nextSibling); + dismissToast(toast); + }); + } + + function restoreElement(el, parent, nextSibling) { + el.style.transition = ''; + el.style.opacity = ''; + el.style.maxHeight = ''; + el.style.overflow = ''; + if (nextSibling) { + parent.insertBefore(el, nextSibling); + } else { + parent.appendChild(el); + } + } + + function dismissToast(toast) { + toast.classList.remove('beep-toast-visible'); + setTimeout(function() { toast.remove(); }, 300); + } + + /* ---------- Toast notification ---------- */ + function showToast(message, type) { + var existing = document.querySelector('.beep-toast.beep-toast-msg'); + if (existing) existing.remove(); + + var toast = document.createElement('div'); + toast.className = 'beep-toast beep-toast-msg beep-toast-' + (type || 'info'); + toast.textContent = message; + document.body.appendChild(toast); + requestAnimationFrame(function() { + toast.classList.add('beep-toast-visible'); + }); + setTimeout(function() { dismissToast(toast); }, 3000); + } + + /* ---------- Helpers ---------- */ + function requireLogin() { + if (config.isLoggedIn) return true; + if (config.loginUrl) window.location.href = config.loginUrl; + return false; + } + + function autosize(el) { + el.style.height = 'auto'; + el.style.height = el.scrollHeight + 'px'; + } + + function countChars(s) { + return Array.from(s).length; + } + + function escapeHtml(str) { + var div = document.createElement('div'); + div.appendChild(document.createTextNode(str)); + return div.innerHTML; + } + + /* ---------- Media upload (images) ---------- */ + function initMedia(compose, feed) { + var input = compose && compose.querySelector('[data-beep-media-input]'); + var preview = compose && compose.querySelector('[data-beep-media-preview]'); + var counter = compose && compose.querySelector('[data-beep-media-count]'); + var voiceInput = compose && compose.querySelector('[data-beep-voice-input]'); + var voicePreview = compose && compose.querySelector('[data-beep-voice-preview]'); + if (!input && !voiceInput) return; + + var pendingImages = []; + var pendingVoice = null; + + // Voice note input + if (voiceInput) { + voiceInput.addEventListener('change', function (e) { + var files = e.target.files; + if (!files || !files.length) return; + var file = files[0]; + if (file.size > 20 * 1024 * 1024) { + showToast('Voice note must be under 20 MB.', 'error'); + voiceInput.value = ''; + return; + } + var accepted = ['audio/mpeg','audio/ogg','audio/wav','audio/webm','audio/mp4','audio/x-m4a']; + if (accepted.indexOf(file.type) === -1) { + showToast('Only MP3, OGG, WAV, WebM, and M4A audio are allowed.', 'error'); + voiceInput.value = ''; + return; + } + if (pendingVoice) { + showToast('Only one voice note per beep.', 'error'); + voiceInput.value = ''; + return; + } + var reader = new FileReader(); + reader.onload = function (ev) { + var id = 'voice-' + Date.now(); + pendingVoice = { file: file, id: id }; + compose._beepPendingVoice = pendingVoice; + voicePreview.innerHTML = '
Voice note ready
'; + voicePreview.hidden = false; + }; + reader.readAsDataURL(file); + voiceInput.value = ''; + }); + } + + // Voice remove button + if (voicePreview) { + voicePreview.addEventListener('click', function (e) { + var btn = e.target.closest('[data-beep-voice-remove]'); + if (!btn) return; + pendingVoice = null; + if (compose) compose._beepPendingVoice = null; + voicePreview.innerHTML = ''; + voicePreview.hidden = true; + }); + } + + if (input) { + input.addEventListener('change', function (e) { + var files = Array.prototype.slice.call(e.target.files); + if (!files.length) return; + var room = 4 - pendingImages.length; + if (room <= 0) { input.value = ''; return; } + files = files.slice(0, room); + files.forEach(function (file) { + if (file.size > 10 * 1024 * 1024) { + showToast('Image must be under 10 MB: ' + file.name, 'error'); + return; + } + var reader = new FileReader(); + reader.onload = function (ev) { + var url = ev.target.result; + var id = 'pending-' + Date.now() + '-' + Math.random().toString(36).substr(2, 6); + pendingImages.push({ file: file, previewUrl: url, id: id }); + renderPreviews(); + }; + reader.readAsDataURL(file); + }); + input.value = ''; + }); + } + + function renderPreviews() { + if (!pendingImages.length) { + preview.innerHTML = ''; + preview.hidden = true; + if (counter) counter.hidden = true; + return; + } + preview.hidden = false; + if (counter) { + counter.textContent = pendingImages.length + '/4'; + counter.hidden = false; + } + preview.innerHTML = pendingImages.map(function (img) { + return '
' + + 'Preview' + + '' + + '
'; + }).join(''); + } + + if (preview) { + preview.addEventListener('click', function (e) { + var btn = e.target.closest('[data-remove]'); + if (!btn) return; + var id = btn.dataset.remove; + pendingImages = pendingImages.filter(function (img) { return img.id !== id; }); + compose._beepPendingImages = pendingImages; + renderPreviews(); + }); + } + + if (compose) { + compose._beepPendingImages = pendingImages; + compose._beepPendingVoice = pendingVoice; + } + } + + function uploadPendingImages(postId, pendingImages, compose) { + if (!pendingImages || !pendingImages.length) return Promise.resolve(); + var promises = pendingImages.map(function (img) { + var formData = new FormData(); + formData.append('file', img.file); + return fetch(config.restUrl + 'media/' + postId, { + method: 'POST', + headers: { 'X-WP-Nonce': config.nonce }, + credentials: 'same-origin', + body: formData + }) + .then(handleResponse) + .catch(function (err) { + console.warn('Image upload failed:', img.file.name, err); + }); + }); + return Promise.all(promises).then(function () { + pendingImages.length = 0; + if (compose) { + var preview = compose.querySelector('[data-beep-media-preview]'); + if (preview) { preview.innerHTML = ''; preview.hidden = true; } + var counter = compose.querySelector('[data-beep-media-count]'); + if (counter) counter.hidden = true; + } + }); + } + + function uploadPendingVoice(postId, pendingVoice, compose) { + if (!pendingVoice) return Promise.resolve(); + var formData = new FormData(); + formData.append('file', pendingVoice.file); + return fetch(config.restUrl + 'voice/' + postId, { + method: 'POST', + headers: { 'X-WP-Nonce': config.nonce }, + credentials: 'same-origin', + body: formData + }) + .then(handleResponse) + .then(function () { + if (compose) { + compose._beepPendingVoice = null; + var vp = compose.querySelector('[data-beep-voice-preview]'); + if (vp) { vp.innerHTML = ''; vp.hidden = true; } + } + }) + .catch(function (err) { + console.warn('Voice upload failed:', err); + }); + } + + /* ---------- Thread / Conversation modal ---------- */ + function openThread(postId) { + var modal = document.querySelector('[data-beep-thread-modal]'); + var content = modal && modal.querySelector('[data-beep-thread-content]'); + var loading = modal && modal.querySelector('.beep-thread-loading'); + if (!modal || !content) return; + modal.hidden = false; + if (loading) loading.style.display = 'block'; + content.innerHTML = ''; + + fetch(config.restUrl + 'thread/' + postId, { + headers: { 'X-WP-Nonce': config.nonce }, + credentials: 'same-origin' + }) + .then(handleResponse) + .then(function(data) { + if (loading) loading.style.display = 'none'; + // data can be an array directly or { thread: [...] } + var thread = Array.isArray(data) ? data : (data.thread || []); + renderThread(thread, content); + }) + .catch(function() { + if (loading) loading.textContent = 'Failed to load conversation.'; + }); + } + + function closeThread() { + var modal = document.querySelector('[data-beep-thread-modal]'); + if (modal) modal.hidden = true; + } + + function renderThread(thread, container) { + if (!thread || !thread.length) { + container.innerHTML = '

No replies yet.

'; + return; + } + var html = ''; + thread.forEach(function(item) { + var indent = Math.min(item.depth, 5) * 24; + var author = item.author || {}; + var avatar = escapeHtml(author.avatar || 'https://www.gravatar.com/avatar/?s=48&d=mp'); + var name = escapeHtml(author.name || 'Unknown'); + var username = escapeHtml(author.username || ''); + var content_text = escapeHtml(item.content || ''); + var time_ago = escapeHtml(item.time_ago || ''); + var replyClass = item.depth > 0 ? 'beep-thread-reply' : 'beep-thread-root'; + html += '
'; + html += '
' + name + '
'; + html += '
'; + html += '
'; + html += '' + name + ''; + html += '@' + username + ''; + html += '' + time_ago + ''; + html += '
'; + html += '
' + content_text + '
'; + html += '
'; + html += '' + (item.reply_count || 0) + ' replies'; + html += '' + (item.like_count || 0) + ' likes'; + html += '
'; + }); + container.innerHTML = html; + } + + /* ---------- Quote posts ---------- */ + function openComposerWithQuote(quotedId) { + var compose = document.querySelector('[data-beep-compose]'); + if (!compose) return; + var form = compose.querySelector('.beep-compose-body'); + if (form) form.style.display = 'block'; + compose.scrollIntoView({ behavior: 'smooth', block: 'center' }); + + fetch(config.restUrl + 'quote/' + quotedId, { + headers: { 'X-WP-Nonce': config.nonce }, + credentials: 'same-origin' + }) + .then(handleResponse) + .then(function(quoted) { + compose._beepQuotedPost = { id: quotedId, data: quoted }; + showQuotePreview(compose, quoted); + }) + .catch(function(err) { console.warn('Could not load quoted beep:', err); }); + } + + function showQuotePreview(compose, quoted) { + var preview = compose && compose.querySelector('[data-beep-quote-preview]'); + var removeBtn = compose && compose.querySelector('[data-beep-quote-remove]'); + if (!preview || !quoted) return; + var author = quoted.author || {}; + var avatar = escapeHtml(author.avatar || 'https://www.gravatar.com/avatar/?s=48&d=mp'); + var name = escapeHtml(author.name || 'Unknown'); + var username = escapeHtml(author.username || ''); + var time_ago = escapeHtml(quoted.time_ago || ''); + var content = escapeHtml(quoted.content || ''); + preview.innerHTML = '
' + + '
' + name + '
' + + '
' + + '
' + name + ' ' + + '@' + username + ' ' + + '· ' + + '' + time_ago + '
' + + '
' + content + '
'; + preview.hidden = false; + if (removeBtn) removeBtn.hidden = false; + } + + function clearQuotePreview(compose) { + if (!compose) return; + compose._beepQuotedPost = null; + var preview = compose.querySelector('[data-beep-quote-preview]'); + var removeBtn = compose.querySelector('[data-beep-quote-remove]'); + if (preview) { preview.innerHTML = ''; preview.hidden = true; } + if (removeBtn) removeBtn.hidden = true; + } + + /* ---------- GIF Picker (Giphy) ---------- */ + function openGifPicker(compose) { + var modal = document.querySelector('[data-beep-gif-modal]'); + if (!modal) return; + modal.hidden = false; + var searchInput = modal.querySelector('[data-beep-gif-search]'); + if (searchInput) searchInput.value = ''; + var grid = modal.querySelector('[data-beep-gif-grid]'); + if (grid) grid.innerHTML = '

Type to search GIFs...

'; + if (searchInput) searchInput.focus(); + } + + function closeGifPicker() { + var modal = document.querySelector('[data-beep-gif-modal]'); + if (modal) modal.hidden = true; + } + + function searchGifs(query, compose) { + if (!query || !query.trim()) return; + var apiKey = config.giphyKey || ''; + if (!apiKey) { + console.warn('Beep: No Giphy API key configured.'); + return; + } + var modal = document.querySelector('[data-beep-gif-modal]'); + var grid = modal && modal.querySelector('[data-beep-gif-grid]'); + if (!grid) return; + grid.innerHTML = '

Searching...

'; + + var url = 'https://api.giphy.com/v1/gifs/search?api_key=' + encodeURIComponent(apiKey) + '&q=' + encodeURIComponent(query) + '&limit=30&rating=g'; + + fetch(url) + .then(function(res) { return res.json(); }) + .then(function(data) { + if (!data.data || !data.data.length) { + grid.innerHTML = '

No GIFs found.

'; + return; + } + grid.innerHTML = ''; + data.data.forEach(function(gif) { + var imgUrl = gif.images && gif.images.fixed_width_small && gif.images.fixed_width_small.url; + if (!imgUrl) return; + var item = document.createElement('div'); + item.className = 'beep-gif-item'; + var altText = escapeHtml(gif.title || ''); + item.innerHTML = '' + altText + ''; + item.addEventListener('click', function() { + selectGif(gif, compose); + }); + grid.appendChild(item); + }); + }) + .catch(function() { + grid.innerHTML = '

Search failed.

'; + }); + } + + function selectGif(gif, compose) { + if (!compose) return; + var url = gif.images && gif.images.fixed_width && gif.images.fixed_width.url; + if (!url) return; + compose._beepGifUrl = url; + var preview = compose.querySelector('[data-beep-gif-preview]'); + if (preview) { + preview.innerHTML = '
GIF
'; + preview.hidden = false; + } + closeGifPicker(); + } + + /* ---------- Poll helpers ---------- */ + function openPollSection(compose) { + var pollSection = compose.querySelector('[data-beep-compose-poll]'); + if (!pollSection) return; + pollSection.hidden = false; + var questionInput = pollSection.querySelector('[data-beep-poll-question]'); + if (questionInput) questionInput.focus(); + var options = pollSection.querySelectorAll('[data-beep-poll-option]'); + if (options.length < 2) { + while (options.length < 2) { + addPollOption(compose); + options = pollSection.querySelectorAll('[data-beep-poll-option]'); + } + } + } + + function addPollOption(compose) { + var pollSection = compose.querySelector('[data-beep-compose-poll]'); + if (!pollSection) return; + var optionsContainer = pollSection.querySelector('[data-beep-poll-options]'); + if (!optionsContainer) return; + var optionCount = optionsContainer.querySelectorAll('[data-beep-poll-option]').length; + if (optionCount >= 6) return; + var newRow = document.createElement('div'); + newRow.className = 'beep-poll-option-row'; + newRow.innerHTML = ''; + optionsContainer.appendChild(newRow); + updatePollButtons(compose); + } + + function removePollOption(compose) { + var pollSection = compose.querySelector('[data-beep-compose-poll]'); + if (!pollSection) return; + var options = pollSection.querySelectorAll('[data-beep-poll-option]'); + if (options.length <= 2) return; + var lastOption = options[options.length - 1]; + if (lastOption) lastOption.parentElement.remove(); + updatePollButtons(compose); + } + + function updatePollButtons(compose) { + var pollSection = compose.querySelector('[data-beep-compose-poll]'); + if (!pollSection) return; + var options = pollSection.querySelectorAll('[data-beep-poll-option]'); + var addBtn = pollSection.querySelector('[data-beep-poll-add-option]'); + var removeBtn = pollSection.querySelector('[data-beep-poll-remove-option]'); + if (addBtn) addBtn.hidden = options.length >= 6; + if (removeBtn) removeBtn.hidden = options.length <= 2; + } + + function clearPoll(compose) { + if (!compose) return; + compose._beepPoll = null; + var pollSection = compose.querySelector('[data-beep-compose-poll]'); + if (pollSection) { + pollSection.hidden = true; + var question = pollSection.querySelector('[data-beep-poll-question]'); + if (question) question.value = ''; + var options = pollSection.querySelectorAll('[data-beep-poll-option]'); + if (options.length > 2) { + for (var i = options.length - 1; i >= 2; i--) { + if (options[i].parentElement) options[i].parentElement.remove(); + } + } + options = pollSection.querySelectorAll('[data-beep-poll-option]'); + for (var j = 0; j < options.length; j++) { + options[j].value = ''; + } + } + } + + function collectPollData(compose) { + if (!compose) return null; + var pollSection = compose.querySelector('[data-beep-compose-poll]'); + if (!pollSection || pollSection.hidden) return null; + var questionInput = pollSection.querySelector('[data-beep-poll-question]'); + var question = questionInput ? questionInput.value.trim() : ''; + if (!question) return null; + var optionInputs = pollSection.querySelectorAll('[data-beep-poll-option]'); + var options = []; + for (var i = 0; i < optionInputs.length; i++) { + var val = optionInputs[i].value.trim(); + if (val) options.push(val); + } + if (options.length < 2) return null; + return { question: question, options: options }; + } + + function createPoll(beepId, compose) { + var pollData = collectPollData(compose); + if (!pollData) return Promise.resolve(); + return fetch(config.restUrl + 'poll/' + beepId, { + method: 'POST', + headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': config.nonce }, + credentials: 'same-origin', + body: JSON.stringify(pollData) + }) + .then(handleResponse) + .catch(function(err) { + console.warn('Poll creation failed:', err); + }); + } + + function handlePollVote(btn) { + var beepId = btn.dataset.beepPollBeep; + var optionIndex = parseInt(btn.dataset.beepPollVote, 10); + if (!beepId || isNaN(optionIndex)) return; + btn.disabled = true; + fetch(config.restUrl + 'poll/' + beepId + '/vote', { + method: 'POST', + headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': config.nonce }, + credentials: 'same-origin', + body: JSON.stringify({ option_index: optionIndex }) + }) + .then(handleResponse) + .then(function(data) { + var postEl = btn.closest('[data-beep-post]'); + if (postEl) { + var list = postEl.closest('[data-beep-list]'); + if (list) reloadFeed(list.closest('[data-beep-feed]'), 'latest'); + } + }) + .catch(function() { + btn.disabled = false; + }); + } + + /* ---------- Image Lightbox ---------- */ + function openLightbox(src) { + var existing = document.querySelector('.beep-lightbox'); + if (existing) existing.remove(); + var el = document.createElement('div'); + el.className = 'beep-lightbox'; + el.innerHTML = 'Full size image'; + document.body.appendChild(el); + // Close on click outside image or Escape key + el.addEventListener('click', function(e) { + if (e.target === el || e.target.tagName !== 'IMG') closeLightbox(); + }); + var escHandler = function(e) { + if (e.key === 'Escape') { closeLightbox(); document.removeEventListener('keydown', escHandler); } + }; + document.addEventListener('keydown', escHandler); + } + + function closeLightbox() { + var el = document.querySelector('.beep-lightbox'); + if (el) el.remove(); + } + + function handleResponse(res) { + if (!res.ok) return res.json().then(function (j) { throw j; }, function () { throw res; }); + return res.json(); + } +})(); diff --git a/beep.php b/beep.php new file mode 100755 index 0000000..a2288cd --- /dev/null +++ b/beep.php @@ -0,0 +1,39 @@ +register(new \Elementor\Beep_Elementor_Widget()); + } + }, 5); + + // Admin settings (Giphy API key only — full settings via Beep_Settings) + add_action('admin_menu', [__CLASS__, 'add_admin_menu']); + add_action('admin_init', [__CLASS__, 'register_settings']); + } + + public static function add_admin_menu() { + add_options_page( + 'Beep Settings', + 'Beep', + 'manage_options', + 'beep-settings', + [__CLASS__, 'render_settings_page'] + ); + } + + public static function register_settings() { + register_setting('beep_settings_group', 'beep_giphy_key', [ + 'sanitize_callback' => 'sanitize_text_field', + ]); + add_settings_section('beep_main_section', 'API Configuration', null, 'beep-settings'); + add_settings_field( + 'beep_giphy_key', + 'Giphy API Key', + [__CLASS__, 'giphy_key_field'], + 'beep-settings', + 'beep_main_section', + ['label_for' => 'beep_giphy_key'] + ); + } + + public static function giphy_key_field() { + $key = get_option('beep_giphy_key', ''); + echo ''; + echo '

Get a free API key at developers.giphy.com

'; + } + + public static function render_settings_page() { + if (!current_user_can('manage_options')) return; + echo '

Beep Settings

'; + echo '
'; + settings_fields('beep_settings_group'); + do_settings_sections('beep-settings'); + submit_button(); + echo '
'; + } + + public static function activate() { + Beep_CPT::register(); + Beep_Likes::create_table(); + Beep_Polls::create_tables(); + flush_rewrite_rules(); + } + + public static function deactivate() { + flush_rewrite_rules(); + } + + public static function enqueue_assets() { + wp_enqueue_style( + 'beep', + BEEP_URL . 'assets/beep.css', + [], + BEEP_VERSION + ); + wp_enqueue_script( + 'beep', + BEEP_URL . 'assets/beep.js', + [], + BEEP_VERSION, + true + ); + $giphy_key = get_option('beep_giphy_key', ''); + + wp_localize_script('beep', 'BeepConfig', [ + 'restUrl' => esc_url_raw(rest_url('beep/v1/')), + 'nonce' => wp_create_nonce('wp_rest'), + 'charLimit' => BEEP_CHAR_LIMIT, + 'loginUrl' => esc_url_raw(wp_login_url(is_singular() ? get_permalink() : home_url('/'))), + 'isLoggedIn' => is_user_logged_in(), + 'giphyKey' => $giphy_key, + ]); + } +} diff --git a/includes/class-cpt.php b/includes/class-cpt.php new file mode 100755 index 0000000..bc02a47 --- /dev/null +++ b/includes/class-cpt.php @@ -0,0 +1,48 @@ + [ + 'name' => 'Beeps', + 'singular_name' => 'Beep', + 'add_new' => 'New beep', + 'add_new_item' => 'Add new beep', + 'edit_item' => 'Edit beep', + 'view_item' => 'View beep', + 'all_items' => 'All beeps', + 'menu_name' => 'Beeps', + 'search_items' => 'Search beeps', + 'not_found' => 'No beeps found', + 'not_found_in_trash' => 'No beeps in trash', + ], + 'public' => true, + 'show_in_menu' => true, + 'show_in_rest' => true, + 'menu_icon' => 'data:image/png;base64,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', + 'menu_position' => 5, + 'supports' => ['editor', 'author', 'comments'], + 'has_archive' => false, + 'rewrite' => ['slug' => 'beeps'], + 'capability_type' => 'post', + ]); + } + + public static function force_comments_open($open, $post_id) { + if (get_post_type($post_id) === self::POST_TYPE) { + return true; + } + return $open; + } +} diff --git a/includes/class-elementor-widget.php b/includes/class-elementor-widget.php new file mode 100755 index 0000000..69e91e6 --- /dev/null +++ b/includes/class-elementor-widget.php @@ -0,0 +1,127 @@ +start_controls_section( + 'section_feed', + ['label' => 'Feed Settings'] + ); + + $this->add_control( + 'header', + [ + 'label' => 'Header Title', + 'type' => \Elementor\Controls_Manager::TEXT, + 'default' => 'Beep', + 'description' => 'Text shown in the feed header. Leave empty to show the wordmark logo.', + ] + ); + + $this->add_control( + 'show_wordmark', + [ + 'label' => 'Show Wordmark Logo', + 'type' => \Elementor\Controls_Manager::SWITCHER, + 'default' => 'yes', + ] + ); + + $this->add_control( + 'sort', + [ + 'label' => 'Default Sort', + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 'latest', + 'options' => [ + 'latest' => 'Latest First', + 'top' => 'Top / Most Liked', + ], + ] + ); + + $this->add_control( + 'limit', + [ + 'label' => 'Posts Per Page', + 'type' => \Elementor\Controls_Manager::NUMBER, + 'min' => 1, + 'max' => 100, + 'default' => 20, + ] + ); + + $this->end_controls_section(); + + $this->start_controls_section( + 'section_style', + ['label' => 'Appearance'] + ); + + $this->add_group_control( + \Elementor\Group_Control_Typography::get_type(), + [ + 'name' => 'feed_typography', + 'label' => 'Feed Typography', + 'selector' => '{{WRAPPER}} .beep-feed', + ] + ); + + $this->add_control( + 'card_radius', + [ + 'label' => 'Card Border Radius', + 'type' => \Elementor\Controls_Manager::SLIDER, + 'size_units' => ['px'], + 'range' => ['px' => ['min' => 0, 'max' => 32]], + 'default' => ['unit' => 'px', 'size' => 0], + 'selectors' => [ + '{{WRAPPER}} .beep-post' => 'border-radius: {{SIZE}}{{UNIT}};', + ], + ] + ); + + $this->end_controls_section(); + } + + protected function render() { + $settings = $this->get_settings_for_display(); + + $atts = [ + 'header' => $settings['header'] ?: 'Beep', + 'show_wordmark' => $settings['show_wordmark'] ? '1' : '0', + 'sort' => $settings['sort'], + 'limit' => (int) $settings['limit'], + ]; + + echo Beep_Shortcode::render_beep_feed($atts); + } +} \ No newline at end of file diff --git a/includes/class-likes.php b/includes/class-likes.php new file mode 100755 index 0000000..572ec0c --- /dev/null +++ b/includes/class-likes.php @@ -0,0 +1,144 @@ +prefix . BEEP_LIKES_TABLE; + } + + /** + * Create or migrate the likes table. + * The 'post_id' column historically only stored beep IDs; we now also + * use it for comment IDs (replies). 'object_type' distinguishes them. + */ + public static function create_table() { + global $wpdb; + $table = self::table_name(); + $charset = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE $table ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + object_type VARCHAR(20) NOT NULL DEFAULT 'post', + post_id BIGINT(20) UNSIGNED NOT NULL, + user_id BIGINT(20) UNSIGNED NOT NULL, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (id), + UNIQUE KEY object_user (object_type, post_id, user_id), + KEY post_id (post_id), + KEY user_id (user_id) + ) $charset;"; + + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + dbDelta($sql); + + // Migration for installs from v1.0-1.3: add object_type column if missing. + $col = $wpdb->get_var($wpdb->prepare( + "SHOW COLUMNS FROM `$table` LIKE %s", 'object_type' + )); + if (!$col) { + $wpdb->query("ALTER TABLE `$table` ADD COLUMN object_type VARCHAR(20) NOT NULL DEFAULT 'post' AFTER id"); + } + } + + public static function register_routes() { + // Like a beep (post). + register_rest_route('beep/v1', '/like/(?P\d+)', [ + 'methods' => 'POST', + 'callback' => [__CLASS__, 'toggle_post_like'], + 'permission_callback' => [__CLASS__, 'can_interact'], + ]); + + // Like a reply (comment). + register_rest_route('beep/v1', '/reply-like/(?P\d+)', [ + 'methods' => 'POST', + 'callback' => [__CLASS__, 'toggle_reply_like'], + 'permission_callback' => [__CLASS__, 'can_interact'], + ]); + } + + public static function can_interact() { + return is_user_logged_in() && !beep_user_is_banned(get_current_user_id()); + } + + public static function toggle_post_like($request) { + $id = (int) $request['id']; + if (get_post_type($id) !== Beep_CPT::POST_TYPE) { + return new WP_Error('beep_not_a_beep', 'Not a beep.', ['status' => 400]); + } + return rest_ensure_response(self::toggle($id, 'post')); + } + + public static function toggle_reply_like($request) { + $id = (int) $request['id']; + $c = get_comment($id); + if (!$c || get_post_type($c->comment_post_ID) !== Beep_CPT::POST_TYPE) { + return new WP_Error('beep_not_a_reply', 'Not a reply.', ['status' => 400]); + } + return rest_ensure_response(self::toggle($id, 'reply')); + } + + /** + * Toggle a like for current user on the given object. + * @return array {liked: bool, count: int} + */ + public static function toggle($object_id, $object_type) { + global $wpdb; + $table = self::table_name(); + $user_id = get_current_user_id(); + + $existing = $wpdb->get_var($wpdb->prepare( + "SELECT id FROM $table WHERE object_type = %s AND post_id = %d AND user_id = %d", + $object_type, $object_id, $user_id + )); + + if ($existing) { + $wpdb->delete($table, ['id' => $existing], ['%d']); + $liked = false; + } else { + $wpdb->insert($table, [ + 'object_type' => $object_type, + 'post_id' => $object_id, + 'user_id' => $user_id, + 'created_at' => current_time('mysql'), + ], ['%s', '%d', '%d', '%s']); + $liked = true; + } + + return [ + 'liked' => $liked, + 'count' => self::get_count($object_id, $object_type), + ]; + } + + public static function get_count($object_id, $object_type = 'post') { + global $wpdb; + $table = self::table_name(); + return (int) $wpdb->get_var($wpdb->prepare( + "SELECT COUNT(*) FROM $table WHERE object_type = %s AND post_id = %d", + $object_type, $object_id + )); + } + + public static function user_has_liked($object_id, $object_type = 'post', $user_id = null) { + global $wpdb; + if (!$user_id) { + $user_id = get_current_user_id(); + } + if (!$user_id) { + return false; + } + $table = self::table_name(); + return (bool) $wpdb->get_var($wpdb->prepare( + "SELECT id FROM $table WHERE object_type = %s AND post_id = %d AND user_id = %d", + $object_type, $object_id, $user_id + )); + } +} diff --git a/includes/class-media.php b/includes/class-media.php new file mode 100755 index 0000000..f2f97d3 --- /dev/null +++ b/includes/class-media.php @@ -0,0 +1,395 @@ + self::$max_file_size) { + return new WP_Error('file_too_large', 'File exceeds 10 MB limit.'); + } + $mime = mime_content_type($file['tmp_name']); + if (!in_array($mime, self::$image_types, true)) { + return new WP_Error('invalid_type', 'Only JPEG, PNG, GIF, and WebP are allowed.'); + } + + $existing = self::get_images($post_id); + if (count($existing) >= self::$max_images) { + return new WP_Error('too_many', 'Maximum ' . self::$max_images . ' images per beep.'); + } + + require_once ABSPATH . 'wp-admin/includes/file.php'; + require_once ABSPATH . 'wp-admin/includes/image.php'; + require_once ABSPATH . 'wp-admin/includes/media.php'; + + $file_return = wp_handle_sideload($file, [ + 'test_form' => false, + 'mimes' => [ + 'jpg|jpeg' => 'image/jpeg', + 'png' => 'image/png', + 'gif' => 'image/gif', + 'webp' => 'image/webp', + ], + ]); + + if (isset($file_return['error'])) { + return new WP_Error('sideload_error', $file_return['error']); + } + + $attachment = [ + 'post_mime_type' => $file_return['type'], + 'post_title' => preg_replace('/\.[^.]+$/', '', basename($file_return['file'])), + 'post_content' => '', + 'post_status' => 'inherit', + 'guid' => $file_return['url'], + ]; + + $attachment_id = wp_insert_attachment($attachment, $file_return['file'], $post_id); + if (is_wp_error($attachment_id)) { + return $attachment_id; + } + + $attach_data = wp_generate_attachment_metadata($attachment_id, $file_return['file']); + wp_update_attachment_metadata($attachment_id, $attach_data); + + add_post_meta($post_id, self::META_KEY_IMAGES, $attachment_id); + + return [ + 'id' => $attachment_id, + 'url' => wp_get_attachment_url($attachment_id), + 'thumb' => self::get_image_url($attachment_id, 'thumbnail'), + 'sizes' => self::get_image_sizes($attachment_id), + ]; + } + + /** + * Remove a single image from a beep post. + */ + public static function remove_image($post_id, $attachment_id) { + $ids = self::get_images($post_id); + $ids = array_values(array_filter($ids, fn($id) => (int) $id !== (int) $attachment_id)); + delete_post_meta($post_id, self::META_KEY_IMAGES); + foreach ($ids as $id) { + add_post_meta($post_id, self::META_KEY_IMAGES, $id); + } + wp_delete_attachment($attachment_id, true); + } + + /** + * Get image attachment IDs for a beep post. + */ + public static function get_images($post_id) { + $ids = get_post_meta($post_id, self::META_KEY_IMAGES, false); + return array_filter(array_map('intval', (array) $ids)); + } + + /** + * Get image srcset-ready sizes for an attachment. + */ + public static function get_image_sizes($attachment_id) { + $sizes = []; + foreach (['thumbnail', 'medium', 'large', 'full'] as $size) { + $img = wp_get_attachment_image_src($attachment_id, $size); + if ($img) { + $sizes[$size] = ['url' => $img[0], 'width' => $img[1], 'height' => $img[2]]; + } + } + return $sizes; + } + + /** + * Get image URL at a given size. + */ + public static function get_image_url($attachment_id, $size = 'medium') { + $img = wp_get_attachment_image_src($attachment_id, $size); + return $img ? $img[0] : ''; + } + + /** + * Set a video URL for a beep post. + */ + public static function set_video_url($post_id, $url) { + $url = esc_url_raw($url); + if (!$url) return new WP_Error('invalid_url', 'Invalid video URL.'); + update_post_meta($post_id, self::META_KEY_VIDEO, $url); + return true; + } + + /** + * Get the video URL for a beep post. + */ + public static function get_video_url($post_id) { + return esc_url_raw(get_post_meta($post_id, self::META_KEY_VIDEO, true)); + } + + /** + * Detect if a URL is a supported video oEmbed. + */ + public static function detect_video_url($url) { + $patterns = [ + 'youtube' => '#https?://(?:www\.)?youtube\.com/watch\?v=[^\s&#]+#', + 'yt_s' => '#https?://youtu\.be/[^\s&#]+#', + 'vimeo' => '#https?://vimeo\.com/\d+#', + 'twitter' => '#https?://(?:twitter\.com|x\.com)/[^\s#/]+/status/\d+#', + ]; + foreach ($patterns as $name => $pattern) { + if (preg_match($pattern, $url)) return $name; + } + return false; + } + + /** + * Render the Twitter-style image gallery. + * + * @param int[] $image_ids + * @return string HTML + */ + public static function render_image_gallery($image_ids) { + if (empty($image_ids)) return ''; + + $count = count($image_ids); + $grid_class = 'beep-gallery'; + if ($count === 1) $grid_class .= ' beep-gallery-1'; + elseif ($count === 2) $grid_class .= ' beep-gallery-2'; + elseif ($count === 3) $grid_class .= ' beep-gallery-3'; + else $grid_class .= ' beep-gallery-4'; + + $html = '
'; + foreach ($image_ids as $i => $id) { + $full = self::get_image_url($id, 'large'); + $thumb = self::get_image_url($id, 'medium'); + if (!$thumb) $thumb = $full; + if (!$full) continue; + $alt = get_post_meta($id, '_wp_attachment_image_alt', true); + $html .= ''; + } + $html .= '
'; + return $html; + } + + /** + * Render video embed via oEmbed. + */ + public static function render_video_embed($url) { + if (!$url) return ''; + $embed = wp_oembed_get($url, ['width' => 560, 'height' => 315]); + if ($embed) { + return '
' . $embed . '
'; + } + return ''; + } + + /** + * Delete all media for a beep post (when beep is deleted). + */ + public static function delete_media($post_id) { + foreach (self::get_images($post_id) as $id) { + wp_delete_attachment($id, true); + } + delete_post_meta($post_id, self::META_KEY_IMAGES); + delete_post_meta($post_id, self::META_KEY_VIDEO); + } + // Voice note support + private static $audio_types = ['audio/mpeg', 'audio/ogg', 'audio/wav', 'audio/webm', 'audio/mp4', 'audio/x-m4a']; + private static $max_audio_size = 20 * 1024 * 1024; // 20 MB + + public static function handle_voice_upload($post_id, $file) { + if (!is_array($file) || $file['error'] !== UPLOAD_ERR_OK) { + return new WP_Error('upload_error', 'Upload failed.'); + } + if ($file['size'] > self::$max_audio_size) { + return new WP_Error('file_too_large', 'Voice note exceeds 20 MB limit.'); + } + $mime = mime_content_type($file['tmp_name']); + if (!in_array($mime, self::$audio_types, true)) { + return new WP_Error('invalid_type', 'Only MP3, OGG, WAV, WebM, and M4A audio are allowed.'); + } + + require_once ABSPATH . 'wp-admin/includes/file.php'; + require_once ABSPATH . 'wp-admin/includes/media.php'; + + $file_return = wp_handle_upload($file, [ + 'test_form' => false, + 'mimes' => [ + 'mp3' => 'audio/mpeg', + 'ogg' => 'audio/ogg', + 'wav' => 'audio/wav', + 'webm' => 'audio/webm', + 'm4a' => 'audio/mp4', + ], + ]); + + if (isset($file_return['error'])) { + return new WP_Error('upload_error', $file_return['error']); + } + + $attachment = [ + 'post_mime_type' => $file_return['type'], + 'post_title' => preg_replace('/\.[^.]+$/', '', basename($file_return['file'])), + 'post_content' => '', + 'post_status' => 'inherit', + 'guid' => $file_return['url'], + ]; + + $attachment_id = wp_insert_attachment($attachment, $file_return['file'], $post_id); + if (is_wp_error($attachment_id)) { + return $attachment_id; + } + + $attach_data = wp_generate_attachment_metadata($attachment_id, $file_return['file']); + wp_update_attachment_metadata($attachment_id, $attach_data); + + update_post_meta($post_id, 'beep_voice_url', wp_get_attachment_url($attachment_id)); + update_post_meta($post_id, 'beep_voice_id', $attachment_id); + + return [ + 'id' => $attachment_id, + 'url' => wp_get_attachment_url($attachment_id), + ]; + } + + public static function get_voice_url($post_id) { + return esc_url_raw(get_post_meta($post_id, 'beep_voice_url', true)); + } + + public static function remove_voice($post_id) { + $id = (int) get_post_meta($post_id, 'beep_voice_id', true); + if ($id) { + wp_delete_attachment($id, true); + } + delete_post_meta($post_id, 'beep_voice_url'); + delete_post_meta($post_id, 'beep_voice_id'); + } + + public static function render_voice_note($post_id) { + $url = self::get_voice_url($post_id); + if (!$url) return ''; + $duration = ''; + $meta = get_post_meta($post_id, 'beep_voice_id', true); + if ($meta) { + $metadata = wp_get_attachment_metadata($meta); + if ($metadata && isset($metadata['length_formatted'])) { + $duration = $metadata['length_formatted']; + } + } + $dur_html = $duration ? '' . esc_html($duration) . '' : ''; + return '
' . + '' . + '
Voice note
' . + $dur_html . + '
'; + } + + // Video file upload support + private static $video_types = ['video/mp4', 'video/webm', 'video/ogg', 'video/quicktime']; + private static $max_video_size = 100 * 1024 * 1024; // 100 MB + + public static function handle_video_upload($post_id, $file) { + if (!is_array($file) || $file['error'] !== UPLOAD_ERR_OK) { + return new WP_Error('upload_error', 'Upload failed.'); + } + if ($file['size'] > self::$max_video_size) { + return new WP_Error('file_too_large', 'Video exceeds 100 MB limit.'); + } + $mime = mime_content_type($file['tmp_name']); + if (!in_array($mime, self::$video_types, true)) { + return new WP_Error('invalid_type', 'Only MP4, WebM, OGG, and MOV are allowed.'); + } + + require_once ABSPATH . 'wp-admin/includes/file.php'; + require_once ABSPATH . 'wp-admin/includes/media.php'; + + $file_return = wp_handle_upload($file, [ + 'test_form' => false, + 'mimes' => [ + 'mp4' => 'video/mp4', + 'webm' => 'video/webm', + 'ogg' => 'video/ogg', + 'mov' => 'video/quicktime', + ], + ]); + + if (isset($file_return['error'])) { + return new WP_Error('upload_error', $file_return['error']); + } + + $attachment = [ + 'post_mime_type' => $file_return['type'], + 'post_title' => preg_replace('/\.[^.]+$/', '', basename($file_return['file'])), + 'post_content' => '', + 'post_status' => 'inherit', + 'guid' => $file_return['url'], + ]; + + $attachment_id = wp_insert_attachment($attachment, $file_return['file'], $post_id); + if (is_wp_error($attachment_id)) { + return $attachment_id; + } + + $attach_data = wp_generate_attachment_metadata($attachment_id, $file_return['file']); + wp_update_attachment_metadata($attachment_id, $attach_data); + + update_post_meta($post_id, 'beep_video_url', wp_get_attachment_url($attachment_id)); + update_post_meta($post_id, 'beep_video_id', $attachment_id); + + return [ + 'id' => $attachment_id, + 'url' => wp_get_attachment_url($attachment_id), + ]; + } + + public static function get_upload_video_url($post_id) { + return esc_url_raw(get_post_meta($post_id, 'beep_video_url', true)); + } + + public static function remove_video($post_id) { + $id = (int) get_post_meta($post_id, 'beep_video_id', true); + if ($id) { + wp_delete_attachment($id, true); + } + delete_post_meta($post_id, 'beep_video_url'); + delete_post_meta($post_id, 'beep_video_id'); + } + + public static function render_video_player($post_id) { + $url = self::get_upload_video_url($post_id); + if (!$url) return ''; + return '
' . + '
'; + } + +} \ No newline at end of file diff --git a/includes/class-moderation.php b/includes/class-moderation.php new file mode 100755 index 0000000..e2c8458 --- /dev/null +++ b/includes/class-moderation.php @@ -0,0 +1,50 @@ +ID) { + return; + } + $can_ban = current_user_can('edit_users'); + $banned = get_user_meta($user->ID, self::BAN_META_KEY, true) === '1'; + ?> +

Beep moderation

+ + + + + +
+ + + + + +
+ prefix . self::TABLE_NAME; + } + + public static function votes_table_name() { + global $wpdb; + return $wpdb->prefix . self::VOTES_TABLE; + } + + /** + * Create the polls and poll_votes tables. + */ + public static function create_tables() { + global $wpdb; + $polls = self::table_name(); + $votes = self::votes_table_name(); + $charset = $wpdb->get_charset_collate(); + + $polls_sql = "CREATE TABLE $polls ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + beep_id BIGINT(20) UNSIGNED NOT NULL, + question TEXT NOT NULL, + options TEXT NOT NULL, + votes TEXT NOT NULL DEFAULT '[]', + total_votes BIGINT(20) UNSIGNED NOT NULL DEFAULT 0, + ends_at DATETIME NULL, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (id), + KEY beep_id (beep_id) + ) $charset;"; + + $votes_sql = "CREATE TABLE $votes ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + poll_id BIGINT(20) UNSIGNED NOT NULL, + user_id BIGINT(20) UNSIGNED NOT NULL, + option_index INT NOT NULL, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (id), + UNIQUE KEY poll_user (poll_id, user_id), + KEY poll_id (poll_id), + KEY user_id (user_id) + ) $charset;"; + + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + dbDelta($polls_sql); + dbDelta($votes_sql); + } + + public static function register_routes() { + // Create a poll for a beep + register_rest_route('beep/v1', '/poll/(?P\d+)', [ + 'methods' => 'POST', + 'callback' => [__CLASS__, 'create_poll'], + 'permission_callback' => [__CLASS__, 'can_create_poll'], + ]); + + // Get poll data for a beep + register_rest_route('beep/v1', '/poll/(?P\d+)', [ + 'methods' => 'GET', + 'callback' => [__CLASS__, 'get_poll'], + 'permission_callback' => '__return_true', + ]); + + // Vote on a poll + register_rest_route('beep/v1', '/poll/(?P\d+)/vote', [ + 'methods' => 'POST', + 'callback' => [__CLASS__, 'vote'], + 'permission_callback' => [__CLASS__, 'can_vote'], + ]); + } + + public static function can_create_poll() { + return is_user_logged_in() && !beep_user_is_banned(get_current_user_id()); + } + + public static function can_vote() { + return is_user_logged_in() && !beep_user_is_banned(get_current_user_id()); + } + + /** + * Create a poll for a beep post. + * Expects JSON body: { "question": "...", "options": ["a", "b", ...], "ends_at": "YYYY-MM-DDTHH:MM:SS" } + */ + public static function create_poll($request) { + $beep_id = (int) $request['beep_id']; + $post = get_post($beep_id); + + if (!$post || $post->post_type !== Beep_CPT::POST_TYPE) { + return new WP_Error('not_found', 'Beep not found.', ['status' => 404]); + } + + if (!current_user_can('edit_post', $beep_id)) { + return new WP_Error('forbidden', 'Cannot create poll for this beep.', ['status' => 403]); + } + + // Check if poll already exists + if (self::poll_exists($beep_id)) { + return new WP_Error('poll_exists', 'A poll already exists for this beep.', ['status' => 400]); + } + + $body = $request->get_json_params(); + $question = sanitize_text_field($body['question'] ?? ''); + $options = $body['options'] ?? []; + $ends_at = isset($body['ends_at']) ? sanitize_text_field($body['ends_at']) : null; + + if (empty($question)) { + return new WP_Error('missing_question', 'Poll question is required.', ['status' => 400]); + } + + if (count($options) < 2) { + return new WP_Error('too_few_options', 'Poll must have at least 2 options.', ['status' => 400]); + } + + if (count($options) > 6) { + return new WP_Error('too_many_options', 'Poll can have at most 6 options.', ['status' => 400]); + } + + // Sanitize options + $options = array_map('sanitize_text_field', $options); + $votes = array_fill(0, count($options), 0); + + global $wpdb; + $table = self::table_name(); + + $result = $wpdb->insert($table, [ + 'beep_id' => $beep_id, + 'question' => $question, + 'options' => json_encode($options), + 'votes' => json_encode($votes), + 'total_votes' => 0, + 'ends_at' => $ends_at ? date('Y-m-d H:i:s', strtotime($ends_at)) : null, + 'created_at' => current_time('mysql'), + ], ['%d', '%s', '%s', '%s', '%d', '%s', '%s']); + + if ($result === false) { + return new WP_Error('db_error', 'Failed to create poll.', ['status' => 500]); + } + + $poll_id = $wpdb->insert_id; + + // Store poll_id in post meta for easy lookup + update_post_meta($beep_id, 'beep_poll_id', $poll_id); + + return rest_ensure_response([ + 'id' => $poll_id, + 'beep_id' => $beep_id, + 'question' => $question, + 'options' => $options, + 'votes' => $votes, + 'total_votes' => 0, + 'ends_at' => $ends_at, + ]); + } + + /** + * Get poll data for a beep. + */ + public static function get_poll($request) { + $beep_id = (int) $request['beep_id']; + $poll = self::get_poll_by_beep_id($beep_id); + + if (!$poll) { + return new WP_Error('not_found', 'Poll not found.', ['status' => 404]); + } + + $user_id = get_current_user_id(); + $user_vote = null; + if ($user_id) { + $user_vote = self::get_user_vote($poll['id'], $user_id); + } + + return rest_ensure_response([ + 'id' => $poll['id'], + 'beep_id' => $poll['beep_id'], + 'question' => $poll['question'], + 'options' => $poll['options'], + 'votes' => $poll['votes'], + 'total_votes' => $poll['total_votes'], + 'ends_at' => $poll['ends_at'], + 'has_ended' => $poll['ends_at'] ? (strtotime($poll['ends_at']) < time()) : false, + 'user_vote' => $user_vote, + ]); + } + + /** + * Vote on a poll. + * Expects JSON body: { "option_index": 0 } + */ + public static function vote($request) { + $beep_id = (int) $request['beep_id']; + $poll = self::get_poll_by_beep_id($beep_id); + + if (!$poll) { + return new WP_Error('not_found', 'Poll not found.', ['status' => 404]); + } + + // Check if poll has ended + if ($poll['ends_at'] && strtotime($poll['ends_at']) < time()) { + return new WP_Error('poll_ended', 'This poll has ended.', ['status' => 400]); + } + + $body = $request->get_json_params(); + $option_index = (int) ($body['option_index'] ?? -1); + + if ($option_index < 0 || $option_index >= count($poll['options'])) { + return new WP_Error('invalid_option', 'Invalid option index.', ['status' => 400]); + } + + $user_id = get_current_user_id(); + + // Check if user already voted + $existing_vote = self::get_user_vote($poll['id'], $user_id); + if ($existing_vote !== null) { + // If same option, un-vote (toggle) + if ($existing_vote === $option_index) { + return rest_ensure_response(self::remove_vote($poll['id'], $user_id, $option_index, $beep_id)); + } + // Different option - change vote + return rest_ensure_response(self::change_vote($poll['id'], $user_id, $existing_vote, $option_index, $beep_id)); + } + + // Cast new vote + return rest_ensure_response(self::cast_vote($poll['id'], $user_id, $option_index, $beep_id)); + } + + private static function cast_vote($poll_id, $user_id, $option_index, $beep_id) { + global $wpdb; + $polls_table = self::table_name(); + $votes_table = self::votes_table_name(); + + // Insert vote + $wpdb->insert($votes_table, [ + 'poll_id' => $poll_id, + 'user_id' => $user_id, + 'option_index' => $option_index, + 'created_at' => current_time('mysql'), + ], ['%d', '%d', '%d', '%s']); + + // Update poll votes and total + $poll = self::get_poll_by_id($poll_id); + $votes = $poll['votes']; + $votes[$option_index]++; + $total_votes = $poll['total_votes'] + 1; + + $wpdb->update( + $polls_table, + ['votes' => json_encode($votes), 'total_votes' => $total_votes], + ['id' => $poll_id], + ['%s', '%d'], + ['%d'] + ); + + return [ + 'voted' => true, + 'option_index' => $option_index, + 'votes' => $votes, + 'total_votes' => $total_votes, + 'user_vote' => $option_index, + ]; + } + + private static function remove_vote($poll_id, $user_id, $option_index, $beep_id) { + global $wpdb; + $polls_table = self::table_name(); + $votes_table = self::votes_table_name(); + + // Delete vote + $wpdb->delete($votes_table, [ + 'poll_id' => $poll_id, + 'user_id' => $user_id, + ], ['%d', '%d']); + + // Update poll votes and total + $poll = self::get_poll_by_id($poll_id); + $votes = $poll['votes']; + $votes[$option_index] = max(0, $votes[$option_index] - 1); + $total_votes = max(0, $poll['total_votes'] - 1); + + $wpdb->update( + $polls_table, + ['votes' => json_encode($votes), 'total_votes' => $total_votes], + ['id' => $poll_id], + ['%s', '%d'], + ['%d'] + ); + + return [ + 'voted' => false, + 'option_index' => null, + 'votes' => $votes, + 'total_votes' => $total_votes, + 'user_vote' => null, + ]; + } + + private static function change_vote($poll_id, $user_id, $old_index, $new_index, $beep_id) { + global $wpdb; + $polls_table = self::table_name(); + $votes_table = self::votes_table_name(); + + // Update vote + $wpdb->update( + $votes_table, + ['option_index' => $new_index], + ['poll_id' => $poll_id, 'user_id' => $user_id], + ['%d'], + ['%d', '%d'] + ); + + // Update poll votes + $poll = self::get_poll_by_id($poll_id); + $votes = $poll['votes']; + $votes[$old_index] = max(0, $votes[$old_index] - 1); + $votes[$new_index]++; + + $wpdb->update( + $polls_table, + ['votes' => json_encode($votes)], + ['id' => $poll_id], + ['%s'], + ['%d'] + ); + + return [ + 'voted' => true, + 'option_index' => $new_index, + 'votes' => $votes, + 'total_votes' => $poll['total_votes'], + 'user_vote' => $new_index, + ]; + } + + /** + * Get poll by beep ID. + */ + public static function get_poll_by_beep_id($beep_id) { + // First check post meta for poll_id + $poll_id = get_post_meta($beep_id, 'beep_poll_id', true); + if ($poll_id) { + return self::get_poll_by_id($poll_id); + } + + // Fallback to table lookup + global $wpdb; + $table = self::table_name(); + $row = $wpdb->get_row($wpdb->prepare( + "SELECT * FROM $table WHERE beep_id = %d", + $beep_id + ), ARRAY_A); + + if (!$row) { + return null; + } + + return self::format_poll($row); + } + + /** + * Get poll by ID. + */ + public static function get_poll_by_id($poll_id) { + global $wpdb; + $table = self::table_name(); + $row = $wpdb->get_row($wpdb->prepare( + "SELECT * FROM $table WHERE id = %d", + $poll_id + ), ARRAY_A); + + if (!$row) { + return null; + } + + return self::format_poll($row); + } + + /** + * Check if poll exists for a beep. + */ + public static function poll_exists($beep_id) { + return self::get_poll_by_beep_id($beep_id) !== null; + } + + /** + * Get user's vote for a poll. + */ + public static function get_user_vote($poll_id, $user_id) { + global $wpdb; + $table = self::votes_table_name(); + $row = $wpdb->get_row($wpdb->prepare( + "SELECT option_index FROM $table WHERE poll_id = %d AND user_id = %d", + $poll_id, $user_id + )); + + return $row ? (int) $row->option_index : null; + } + + /** + * Format poll row from database. + */ + private static function format_poll($row) { + return [ + 'id' => (int) $row['id'], + 'beep_id' => (int) $row['beep_id'], + 'question' => $row['question'], + 'options' => json_decode($row['options'], true), + 'votes' => json_decode($row['votes'], true), + 'total_votes' => (int) $row['total_votes'], + 'ends_at' => $row['ends_at'], + 'created_at' => $row['created_at'], + ]; + } + + /** + * Get poll results with percentages (for display). + */ + public static function get_results_with_percentages($poll) { + $total = $poll['total_votes']; + $results = []; + foreach ($poll['options'] as $i => $option) { + $votes = $poll['votes'][$i] ?? 0; + $percentage = $total > 0 ? round(($votes / $total) * 100) : 0; + $results[] = [ + 'index' => $i, + 'option' => $option, + 'votes' => $votes, + 'percentage' => $percentage, + ]; + } + return $results; + } +} diff --git a/includes/class-quotes.php b/includes/class-quotes.php new file mode 100755 index 0000000..8ceb15d --- /dev/null +++ b/includes/class-quotes.php @@ -0,0 +1,102 @@ +post_type !== Beep_CPT::POST_TYPE) { + return new WP_Error('invalid_quoted', 'Cannot quote that beep.'); + } + update_post_meta($new_post_id, self::QUOTED_META, (int) $quoted_post_id); + return true; + } + + /** + * Get the quoted post ID for a beep. + */ + public static function get_quoted_post_id($post_id) { + return (int) get_post_meta($post_id, self::QUOTED_META, true); + } + + /** + * Get the quoted post data for rendering. + */ + public static function get_quoted_post($post_id) { + $quoted_id = self::get_quoted_post_id($post_id); + if (!$quoted_id) return null; + + $post = get_post($quoted_id); + if (!$post || $post->post_status !== 'publish') return null; + + $author_id = $post->post_author; + $author = get_userdata($author_id); + $avatar = get_user_meta($author_id, 'beep_avatar', true); + if (!$avatar) { + $avatar = 'https://www.gravatar.com/avatar/' . md5(strtolower($author->user_email ?? '')) . '?s=48&d=mp'; + } + + $content = preg_replace('/\[beep:\d+\]/', '', $post->post_content); + + return [ + 'id' => $post->ID, + 'content' => $content, + 'time_ago'=> self::time_ago(strtotime($post->post_date)), + 'author' => [ + 'id' => $author_id, + 'name' => $author->display_name ?? 'Unknown', + 'username' => $author->user_login ?? '', + 'avatar' => $avatar, + ], + ]; + } + + /** + * Render the quoted beep HTML (the embedded original beep). + */ + public static function render_quoted_post($post_id) { + $quoted = self::get_quoted_post($post_id); + if (!$quoted) return ''; + + $author = $quoted['author']; + $avatar = esc_url($author['avatar']); + $name = esc_html($author['name']); + $handle = esc_html('@' . $author['username']); + $content = make_clickable(wp_kses_post($quoted['content'])); + $time = esc_html($quoted['time_ago']); + $qid = esc_attr($quoted['id']); + + return '
' . + '
' . + '' . $name . '' . + '
' . + '
' . + '
' . + '' . $name . '' . + '' . $handle . '' . + '·' . + '' . $time . '' . + '
' . + '
' . $content . '
' . + '
'; + } + + private static function time_ago($timestamp) { + $diff = time() - $timestamp; + if ($diff < 0) $diff = 0; + if ($diff < 60) return $diff . 's'; + if ($diff < 3600) return floor($diff / 60) . 'm'; + if ($diff < 86400) return floor($diff / 3600) . 'h'; + if ($diff < 604800) return floor($diff / 86400) . 'd'; + return gmdate('M j', $timestamp); + } +} diff --git a/includes/class-replies.php b/includes/class-replies.php new file mode 100755 index 0000000..90116cf --- /dev/null +++ b/includes/class-replies.php @@ -0,0 +1,252 @@ + 'POST', + 'callback' => [__CLASS__, 'submit_beep'], + 'permission_callback' => ['Beep_Likes', 'can_interact'], + ]); + register_rest_route('beep/v1', '/reply/(?P\d+)', [ + 'methods' => 'POST', + 'callback' => [__CLASS__, 'submit_reply'], + 'permission_callback' => ['Beep_Likes', 'can_interact'], + ]); + register_rest_route('beep/v1', '/thread/(?P\d+)', [ + 'methods' => 'GET', + 'callback' => [__CLASS__, 'get_thread_api'], + 'permission_callback' => '__return_true', + ]); + register_rest_route('beep/v1', '/delete/(?P\d+)', [ + 'methods' => 'DELETE', + 'callback' => [__CLASS__, 'delete_beep'], + 'permission_callback' => ['Beep_Likes', 'can_interact'], + ]); + register_rest_route('beep/v1', '/delete-reply/(?P\d+)', [ + 'methods' => 'DELETE', + 'callback' => [__CLASS__, 'delete_reply'], + 'permission_callback' => ['Beep_Likes', 'can_interact'], + ]); + } + + public static function submit_beep($request) { + $content = sanitize_textarea_field($request->get_param('content')); + if (empty($content)) { + return new WP_Error('empty_content', 'Beep cannot be empty.', ['status' => 400]); + } + if (mb_strlen($content) > BEEP_CHAR_LIMIT) { + return new WP_Error('content_too_long', 'Beep exceeds ' . BEEP_CHAR_LIMIT . ' character limit.', ['status' => 400]); + } + + // Handle quote post ID + $quote_id = $request->get_param('quote_id'); + $gif_url = $request->get_param('gif_url'); + + $post_id = wp_insert_post([ + 'post_type' => 'beep', + 'post_content' => $content, + 'post_status' => 'publish', + 'post_author' => get_current_user_id(), + ]); + if (is_wp_error($post_id)) { return $post_id; } + + // Attach quote if provided + if ($quote_id && is_numeric($quote_id)) { + Beep_Quotes::create_quote($post_id, (int) $quote_id); + } + + // Attach GIF URL if provided + if ($gif_url && filter_var($gif_url, FILTER_VALIDATE_URL)) { + update_post_meta($post_id, 'beep_gif_url', esc_url_raw($gif_url)); + } + + return rest_ensure_response(['id' => $post_id, 'url' => get_permalink($post_id)]); + } + + public static function submit_reply($request) { + $post_id = (int) $request['id']; + $parent = get_post($post_id); + if (!$parent || $parent->post_type !== 'beep') { + return new WP_Error('invalid_post', 'Invalid beep post.', ['status' => 400]); + } + $content = sanitize_textarea_field($request->get_param('content')); + if (empty($content)) { + return new WP_Error('empty_content', 'Reply cannot be empty.', ['status' => 400]); + } + $comment_id = wp_insert_comment([ + 'comment_post_ID' => $post_id, + 'comment_content' => $content, + 'comment_author' => get_current_user_id() ? null : 'Anonymous', + 'comment_type' => 'comment', + 'user_id' => get_current_user_id(), + ]); + if (!$comment_id) { + return new WP_Error('insert_failed', 'Could not save reply.', ['status' => 500]); + } + return rest_ensure_response(['id' => $comment_id]); + } + + public static function delete_beep($request) { + $post_id = (int) $request['id']; + $post = get_post($post_id); + if (!$post || $post->post_type !== 'beep') { + return new WP_Error('invalid_post', 'Invalid beep.', ['status' => 400]); + } + if (!current_user_can('delete_post', $post_id)) { + return new WP_Error('forbidden', 'You do not have permission to delete this beep.', ['status' => 403]); + } + // Clean up media + Beep_Media::delete_media($post_id); + $deleted = wp_delete_post($post_id, true); + if (!$deleted) { + return new WP_Error('delete_failed', 'Could not delete.', ['status' => 500]); + } + return rest_ensure_response(['deleted' => true]); + } + + public static function delete_reply($request) { + $comment_id = (int) $request['id']; + $comment = get_comment($comment_id); + if (!$comment) { + return new WP_Error('invalid_reply', 'Reply not found.', ['status' => 404]); + } + // Only allow the reply author or a moderator to delete + $can_delete = ( + (int) $comment->user_id === get_current_user_id() || + current_user_can('moderate_comments') + ); + if (!$can_delete) { + return new WP_Error('forbidden', 'You do not have permission to delete this reply.', ['status' => 403]); + } + $deleted = wp_delete_comment($comment_id, true); + if (!$deleted) { + return new WP_Error('delete_failed', 'Could not delete.', ['status' => 500]); + } + return rest_ensure_response(['deleted' => true]); + } + + public static function get_replies($post_id) { + return get_comments([ + 'post_id' => $post_id, + 'status' => 'approve', + 'order' => 'ASC', + 'type' => 'comment', + ]); + } + + public static function reply_count($post_id) { + return (int) get_comments_number($post_id); + } + + public static function get_thread($post_id, $depth = 0, $max_depth = 10) { + if ($depth > $max_depth) return []; + $post = get_post($post_id); + if (!$post || $post->post_type !== 'beep') return []; + $thread = [self::format_beep_reply($post, $depth)]; + $replies = get_comments([ + 'post_id' => $post_id, 'status' => 'approve', 'order' => 'ASC', + 'type' => 'comment', 'number' => 100, + ]); + foreach ($replies as $reply) { + if ($depth < $max_depth) { + $thread = array_merge($thread, self::get_comment_thread($reply->comment_ID, $depth + 1, $max_depth)); + } + } + return $thread; + } + + private static function get_comment_thread($comment_id, $depth, $max_depth) { + if ($depth > $max_depth) return []; + $comment = get_comment($comment_id); + if (!$comment) return []; + $result = [self::format_comment_reply($comment, $depth)]; + $children = get_comments([ + 'parent' => $comment_id, 'status' => 'approve', 'order' => 'ASC', + 'type' => 'comment', 'number' => 100, + ]); + foreach ($children as $child) { + $result = array_merge($result, self::get_comment_thread($child->comment_ID, $depth + 1, $max_depth)); + } + return $result; + } + + public static function get_thread_api($request) { + $post_id = (int) $request['post_id']; + $thread = self::get_thread($post_id); + return rest_ensure_response(['thread' => $thread]); + } + + public static function format_beep_reply($post, $depth = 0) { + $author_id = $post->post_author; + $author = get_userdata($author_id); + $avatar = get_user_meta($author_id, 'beep_avatar', true); + if (!$avatar) { + $avatar = 'https://www.gravatar.com/avatar/' . md5(strtolower($author->user_email ?? '')) . '?s=48&d=mp'; + } + return [ + 'id' => $post->ID, + 'parent_id' => $post->post_parent ?: null, + 'is_post' => true, + 'depth' => $depth, + 'content' => $post->post_content, + 'time_ago' => self::time_ago(strtotime($post->post_date)), + 'like_count' => Beep_Likes::get_count($post->ID, 'post'), + 'reply_count' => self::reply_count($post->ID), + 'author' => [ + 'id' => $author_id, + 'name' => $author->display_name ?? 'Unknown', + 'username' => $author->user_login ?? '', + 'avatar' => $avatar, + ], + ]; + } + + public static function format_comment_reply($comment, $depth = 0) { + $author_id = (int) $comment->user_id; + $author = $author_id ? get_userdata($author_id) : null; + if ($author_id) { + $avatar = get_user_meta($author_id, 'beep_avatar', true); + if (!$avatar) { + $avatar = 'https://www.gravatar.com/avatar/' . md5(strtolower($author->user_email ?? '')) . '?s=48&d=mp'; + } + $name = $author->display_name ?? 'Unknown'; + $username = $author->user_login ?? ''; + } else { + $avatar = 'https://www.gravatar.com/avatar/?s=48&d=mp'; + $name = esc_html($comment->comment_author); + $username = ''; + } + return [ + 'id' => $comment->comment_ID, + 'parent_id' => (int) $comment->comment_parent ?: null, + 'is_post' => false, + 'depth' => $depth, + 'content' => $comment->comment_content, + 'time_ago' => self::time_ago(strtotime($comment->comment_date)), + 'like_count' => Beep_Likes::get_count($comment->comment_ID, 'reply'), + 'reply_count' => 0, + 'author' => [ + 'id' => $author_id, + 'name' => $name, + 'username' => $username, + 'avatar' => $avatar, + ], + ]; + } + + public static function time_ago($timestamp) { + $diff = time() - $timestamp; + if ($diff < 0) $diff = 0; + if ($diff < 60) return $diff . 's'; + if ($diff < 3600) return floor($diff / 60) . 'm'; + if ($diff < 86400) return floor($diff / 3600) . 'h'; + if ($diff < 604800) return floor($diff / 86400) . 'd'; + return gmdate('M j', $timestamp); + } +} diff --git a/includes/class-settings.php b/includes/class-settings.php new file mode 100755 index 0000000..5370994 --- /dev/null +++ b/includes/class-settings.php @@ -0,0 +1,1118 @@ + '#FFFFFF', // Twitter Light: white + 'bg_card' => '#F5F8FA', // Twitter Light: card background + 'bg_card_hover' => '#EBEEF0', // Twitter Light: hover state + 'bg_input' => '#F5F8FA', // Twitter Light: input fields + + // Colors - Text + 'text_primary' => '#0F1419', // Twitter Light: main text (near black) + 'text_secondary' => '#536471', // Twitter Light: muted text + 'text_link' => '#1D9BF0', // Twitter Light: links (Twitter blue) + + // Colors - Borders & Dividers + 'border_color' => '#EFF3F4', // Twitter Light: borders and dividers + 'border_hover' => '#CBD0D4', // Twitter Light: hover border + + // Colors - Interactive + 'color_like' => '#F91880', // Like heart (Twitter pink) + 'color_repost' => '#00BA7C', // Repost green + 'color_reply' => '#1D9BF0', // Reply blue + 'color_quote' => '#1D9BF0', // Quote blue + 'color_poll' => '#1D9BF0', // Poll blue + + // Colors - Buttons + 'btn_primary_bg' => '#1D9BF0', // Primary button background + 'btn_primary_text' => '#FFFFFF', // Primary button text + 'btn_secondary_bg' => '#2F3336', // Secondary button background + 'btn_secondary_text' => '#E7E9EA', // Secondary button text + + // Colors - Avatar Ring + 'avatar_ring' => '#2F3336', // Avatar ring color + + // Branding + 'logo_url' => '', // Custom logo URL + 'icon_url' => '', // Custom icon URL (favicon) + 'site_name' => 'Beep', // Or 'X' or 'Twitter' + 'tagline' => 'Messages from', + + // Layout + 'feed_max_width' => '600px', // Max width of feed + 'feed_padding' => '16px', // Feed padding + 'post_padding' => '14px 20px', // Post padding + 'avatar_size' => '48px', // Avatar dimensions + 'gap_between_posts' => '12px', // Gap between posts + + // Border Radius + 'radius_card' => '16px', // Card border radius + 'radius_avatar' => '9999px', // Avatar circle + 'radius_button' => '9999px', // Buttons/pills + 'radius_input' => '4px', // Input fields + + // Typography + 'font_family' => '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif', + 'font_size_base' => '15px', // Base font size + 'font_size_small' => '13px', // Small text (timestamps) + 'font_size_large' => '20px', // Large text (names) + + // Features (on/off) + 'enable_likes' => '1', + 'enable_reposts' => '1', + 'enable_quotes' => '1', + 'enable_polls' => '1', + 'enable_follows' => '1', + 'enable_media' => '1', + 'enable_replies' => '1', + + // Behavior + 'character_limit' => '280', + 'posts_per_page' => '20', + 'auto_refresh' => '0', // Auto refresh interval (0 = off) + 'public_posting' => '0', // Allow public posting without login + + // Content + 'show_avatar' => '1', + 'show_stats' => '1', // Show reply/like counts + 'show_timestamps' => '1', // Show relative time + 'show_gravatar' => '1', // Show Gravatar + 'show_public_notice' => '1', // Show "sign in to post" notice + + // Animation + 'animation_speed' => '150', // Transition speed in ms + ]; + + /** + * Initialize settings + */ + public static function init() { + add_action('admin_init', [__CLASS__, 'register_settings']); + add_action('admin_menu', [__CLASS__, 'add_settings_page']); + add_filter('plugin_action_links_' . plugin_basename(BEEP_FILE), [__CLASS__, 'add_settings_link']); + add_action('wp_head', [__CLASS__, 'inject_css_variables'], 100); + } + + /** + * Get all settings with defaults + */ + public static function get_settings() { + $saved = get_option(self::OPTION_KEY, []); + return wp_parse_args($saved, self::$defaults); + } + + /** + * Get a single setting + */ + public static function get($key, $default = null) { + $settings = self::get_settings(); + return isset($settings[$key]) ? $settings[$key] : ($default ?? (self::$defaults[$key] ?? null)); + } + + /** + * Register settings with WordPress + */ + public static function register_settings() { + register_setting( + self::OPTION_KEY, + self::OPTION_KEY, + [ + 'type' => 'array', + 'sanitize_callback' => [__CLASS__, 'sanitize_settings'], + 'default' => [], + ] + ); + + // === Section: Colors - Backgrounds === + add_settings_section( + 'beep_colors_bg', + 'Colors - Backgrounds', + [__CLASS__, 'section_colors_bg_description'], + 'beep-settings' + ); + + add_settings_field( + 'bg_main', + 'Main Background', + [__CLASS__, 'field_color_picker'], + 'beep-settings', + 'beep_colors_bg', + ['key' => 'bg_main', 'label' => 'Feed/Page background'] + ); + + add_settings_field( + 'bg_card', + 'Card Background', + [__CLASS__, 'field_color_picker'], + 'beep-settings', + 'beep_colors_bg', + ['key' => 'bg_card', 'label' => 'Post cards & containers'] + ); + + add_settings_field( + 'bg_card_hover', + 'Card Hover Background', + [__CLASS__, 'field_color_picker'], + 'beep-settings', + 'beep_colors_bg', + ['key' => 'bg_card_hover', 'label' => 'Hover state for cards'] + ); + + add_settings_field( + 'bg_input', + 'Input Background', + [__CLASS__, 'field_color_picker'], + 'beep-settings', + 'beep_colors_bg', + ['key' => 'bg_input', 'label' => 'Textarea/input fields'] + ); + + // === Section: Colors - Text === + add_settings_section( + 'beep_colors_text', + 'Colors - Text', + [__CLASS__, 'section_colors_text_description'], + 'beep-settings' + ); + + add_settings_field( + 'text_primary', + 'Primary Text', + [__CLASS__, 'field_color_picker'], + 'beep-settings', + 'beep_colors_text', + ['key' => 'text_primary', 'label' => 'Main text color'] + ); + + add_settings_field( + 'text_secondary', + 'Secondary Text', + [__CLASS__, 'field_color_picker'], + 'beep-settings', + 'beep_colors_text', + ['key' => 'text_secondary', 'label' => 'Muted/timestamp text'] + ); + + add_settings_field( + 'text_link', + 'Link Color', + [__CLASS__, 'field_color_picker'], + 'beep-settings', + 'beep_colors_text', + ['key' => 'text_link', 'label' => 'Links & buttons'] + ); + + // === Section: Colors - Interactive === + add_settings_section( + 'beep_colors_interactive', + 'Colors - Interactive Elements', + [__CLASS__, 'section_colors_interactive_description'], + 'beep-settings' + ); + + add_settings_field( + 'color_like', + 'Like Heart Color', + [__CLASS__, 'field_color_picker'], + 'beep-settings', + 'beep_colors_interactive', + ['key' => 'color_like', 'label' => 'Heart/like button'] + ); + + add_settings_field( + 'color_repost', + 'Repost Color', + [__CLASS__, 'field_color_picker'], + 'beep-settings', + 'beep_colors_interactive', + ['key' => 'color_repost', 'label' => 'Repost button'] + ); + + add_settings_field( + 'color_reply', + 'Reply Color', + [__CLASS__, 'field_color_picker'], + 'beep-settings', + 'beep_colors_interactive', + ['key' => 'color_reply', 'label' => 'Reply button'] + ); + + add_settings_field( + 'border_color', + 'Border Color', + [__CLASS__, 'field_color_picker'], + 'beep-settings', + 'beep_colors_interactive', + ['key' => 'border_color', 'label' => 'Dividers & borders'] + ); + + // === Section: Layout === + add_settings_section( + 'beep_layout', + 'Layout & Spacing', + [__CLASS__, 'section_layout_description'], + 'beep-settings' + ); + + add_settings_field( + 'feed_max_width', + 'Feed Max Width', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_layout', + ['key' => 'feed_max_width', 'label' => 'e.g. 600px or 100%'] + ); + + add_settings_field( + 'feed_padding', + 'Feed Padding', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_layout', + ['key' => 'feed_padding', 'label' => 'e.g. 16px'] + ); + + add_settings_field( + 'post_padding', + 'Post Padding', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_layout', + ['key' => 'post_padding', 'label' => 'e.g. 14px 20px'] + ); + + add_settings_field( + 'avatar_size', + 'Avatar Size', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_layout', + ['key' => 'avatar_size', 'label' => 'e.g. 48px'] + ); + + // === Section: Border Radius === + add_settings_section( + 'beep_radius', + 'Border Radius', + [__CLASS__, 'section_radius_description'], + 'beep-settings' + ); + + add_settings_field( + 'radius_card', + 'Card Radius', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_radius', + ['key' => 'radius_card', 'label' => 'e.g. 16px for cards, 0 for sharp edges'] + ); + + add_settings_field( + 'radius_avatar', + 'Avatar Radius', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_radius', + ['key' => 'radius_avatar', 'label' => 'e.g. 9999px for circle'] + ); + + // === Section: Typography === + add_settings_section( + 'beep_typography', + 'Typography', + [__CLASS__, 'section_typography_description'], + 'beep-settings' + ); + + add_settings_field( + 'font_family', + 'Font Family', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_typography', + ['key' => 'font_family', 'label' => 'CSS font-family value'] + ); + + add_settings_field( + 'font_size_base', + 'Base Font Size', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_typography', + ['key' => 'font_size_base', 'label' => 'e.g. 15px'] + ); + + // === Section: Branding & Media === + add_settings_section( + 'beep_branding', + 'Branding & Media', + [__CLASS__, 'section_branding_description'], + 'beep-settings' + ); + + add_settings_field( + 'logo_url', + 'Logo Image', + [__CLASS__, 'field_media_upload'], + 'beep-settings', + 'beep_branding', + ['key' => 'logo_url', 'label' => 'Upload a logo image. Leave empty to use text.'] + ); + + add_settings_field( + 'icon_url', + 'Icon Image', + [__CLASS__, 'field_media_upload'], + 'beep-settings', + 'beep_branding', + ['key' => 'icon_url', 'label' => 'Upload an icon/favicon image.'] + ); + + add_settings_field( + 'site_name', + 'Site Name', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_branding', + ['key' => 'site_name', 'label' => 'e.g. Beep, X, or Twitter'] + ); + + add_settings_field( + 'tagline', + 'Tagline', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_branding', + ['key' => 'tagline', 'label' => 'Text above logo, e.g. "Messages from"'] + ); + + // === Section: Features === + add_settings_section( + 'beep_features', + 'Features', + [__CLASS__, 'section_features_description'], + 'beep-settings' + ); + + add_settings_field( + 'enable_likes', + 'Enable Likes', + [__CLASS__, 'field_checkbox'], + 'beep-settings', + 'beep_features', + ['key' => 'enable_likes', 'label' => 'Show like button on posts'] + ); + + add_settings_field( + 'enable_reposts', + 'Enable Reposts', + [__CLASS__, 'field_checkbox'], + 'beep-settings', + 'beep_features', + ['key' => 'enable_reposts', 'label' => 'Show repost button'] + ); + + add_settings_field( + 'enable_quotes', + 'Enable Quotes', + [__CLASS__, 'field_checkbox'], + 'beep-settings', + 'beep_features', + ['key' => 'enable_quotes', 'label' => 'Show quote button'] + ); + + add_settings_field( + 'enable_replies', + 'Enable Replies', + [__CLASS__, 'field_checkbox'], + 'beep-settings', + 'beep_features', + ['key' => 'enable_replies', 'label' => 'Allow replying to posts'] + ); + + add_settings_field( + 'enable_media', + 'Enable Media', + [__CLASS__, 'field_checkbox'], + 'beep-settings', + 'beep_features', + ['key' => 'enable_media', 'label' => 'Allow image attachments'] + ); + + add_settings_field( + 'enable_polls', + 'Enable Polls', + [__CLASS__, 'field_checkbox'], + 'beep-settings', + 'beep_features', + ['key' => 'enable_polls', 'label' => 'Allow poll creation'] + ); + + // === Section: Behavior === + add_settings_section( + 'beep_behavior', + 'Behavior', + [__CLASS__, 'section_behavior_description'], + 'beep-settings' + ); + + add_settings_field( + 'character_limit', + 'Character Limit', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_behavior', + ['key' => 'character_limit', 'label' => 'Max characters per post (default 280)'] + ); + + add_settings_field( + 'posts_per_page', + 'Posts Per Page', + [__CLASS__, 'field_text'], + 'beep-settings', + 'beep_behavior', + ['key' => 'posts_per_page', 'label' => 'Number of posts to load'] + ); + + add_settings_field( + 'public_posting', + 'Allow Public Posting', + [__CLASS__, 'field_checkbox'], + 'beep-settings', + 'beep_behavior', + ['key' => 'public_posting', 'label' => 'Allow posting without logging in'] + ); + + // === Section: Content Display === + add_settings_section( + 'beep_content', + 'Content Display', + [__CLASS__, 'section_content_description'], + 'beep-settings' + ); + + add_settings_field( + 'show_avatar', + 'Show Avatars', + [__CLASS__, 'field_checkbox'], + 'beep-settings', + 'beep_content', + ['key' => 'show_avatar', 'label' => 'Display user profile pictures'] + ); + + add_settings_field( + 'show_stats', + 'Show Statistics', + [__CLASS__, 'field_checkbox'], + 'beep-settings', + 'beep_content', + ['key' => 'show_stats', 'label' => 'Display reply/like counts'] + ); + + add_settings_field( + 'show_timestamps', + 'Show Timestamps', + [__CLASS__, 'field_checkbox'], + 'beep-settings', + 'beep_content', + ['key' => 'show_timestamps', 'label' => 'Display relative time'] + ); + + add_settings_field( + 'show_public_notice', + 'Show Public Notice', + [__CLASS__, 'field_checkbox'], + 'beep-settings', + 'beep_content', + ['key' => 'show_public_notice', 'label' => 'Show "Sign in to post" notice'] + ); + } + + /** + * Add settings page to admin menu + */ + public static function add_settings_page() { + add_options_page( + 'Beep Settings', + 'Beep', + 'manage_options', + 'beep-settings', + [__CLASS__, 'render_settings_page'] + ); + } + + /** + * Add settings link on Plugins page + */ + public static function add_settings_link($links) { + $settings_link = '' . __('Settings') . ''; + array_unshift($links, $settings_link); + return $links; + } + + /** + * Sanitize settings on save + */ + public static function sanitize_settings($input) { + $sanitized = []; + + foreach (self::$defaults as $key => $default) { + if (is_bool($default)) { + $sanitized[$key] = !empty($input[$key]) ? '1' : '0'; + } elseif (is_int($default)) { + $sanitized[$key] = isset($input[$key]) ? intval($input[$key]) : $default; + } else { + $sanitized[$key] = isset($input[$key]) ? sanitize_text_field($input[$key]) : $default; + } + } + + return $sanitized; + } + + /** + * Render the settings page + */ + public static function render_settings_page() { + if (!current_user_can('manage_options')) { + return; + } + ?> +
+

Beep Settings

+ +
+

Customize the appearance and behavior of your Beep feed. Changes take effect immediately.

+

+ Quick Presets: + + + +

+
+ +
+ +
+ +
+ + +
+ + + + + + */ + public static function inject_css_variables() { + $settings = self::get_settings(); + ?> + + Background colors for the feed and cards.

'; + } + + public static function section_colors_text_description() { + echo '

Text colors throughout the feed.

'; + } + + public static function section_colors_interactive_description() { + echo '

Colors for interactive elements like buttons and icons.

'; + } + + public static function section_layout_description() { + echo '

Spacing and layout dimensions.

'; + } + + public static function section_radius_description() { + echo '

Border radius for rounded corners. Use 0px for sharp edges (Twitter style), 16px for rounded cards.

'; + } + + public static function section_typography_description() { + echo '

Font settings.

'; + } + + public static function section_branding_description() { + echo '

Logo, icon, and site name settings.

'; + } + + public static function section_features_description() { + echo '

Toggle features on or off.

'; + } + + public static function section_behavior_description() { + echo '

How the feed behaves.

'; + } + + public static function section_content_description() { + echo '

What to show/hide in the feed.

'; + } + + // === Field Renderers === + public static function field_color_picker($args) { + $key = $args['key']; + $label = $args['label']; + $value = self::get($key); + ?> + + +

+ + +

+ + + + + +
+ Recommended for :
+ + +
Transparent PNG/SVG — the header has a blurred backdrop + +
Will be displayed at 32×32px in posts, 24×24px in replies + +
+ +
+ +
+ + +
+ + +
+ + + +
+ + No image chosen yet — click "Choose Image" or paste a URL above +
+ +
+ + + + +
+ +

+ 'GET', + 'callback' => [__CLASS__, 'fetch_feed'], + 'permission_callback' => '__return_true', + 'args' => [ + 'sort' => ['default' => 'latest'], + 'limit' => ['default' => 50, 'validate_callback' => function ($v) { return is_numeric($v); }], + 'offset' => ['default' => 0, 'validate_callback' => function ($v) { return is_numeric($v); }], + ], + ]); + } + + /** + * REST endpoint: re-render the feed list with the given sort. + */ + public static function fetch_feed($request) { + $sort = $request->get_param('sort') === 'top' ? 'top' : 'latest'; + $limit = max(1, (int) $request->get_param('limit')); + $offset = max(0, (int) $request->get_param('offset')); + $posts = ($sort === 'top') ? self::get_top_beeps($limit + 1, $offset) : self::get_latest_beeps($limit + 1, $offset); + + $has_more = count($posts) > $limit; + if ($has_more) { + $posts = array_slice($posts, 0, $limit); + } + + $html = ''; + foreach ($posts as $p) { + $html .= beep_render_post($p); + } + if ($html === '' && $offset === 0) { + $empty_bird = beep_bird_svg( ['size' => 64, 'fill' => '#4a90c4'] ); + $html = '
' . $empty_bird . '

No beeps yet.

Be the first to share something!
'; + } + return rest_ensure_response(['html' => $html, 'sort' => $sort, 'has_more' => $has_more, 'offset' => $offset + count($posts)]); + } + + public static function get_latest_beeps($limit, $offset = 0) { + global $wpdb; + return $wpdb->get_results($wpdb->prepare( + "SELECT * FROM {$wpdb->posts} + WHERE post_type = %s AND post_status = 'publish' + ORDER BY post_date DESC + LIMIT %d OFFSET %d", + Beep_CPT::POST_TYPE, $limit, $offset + )); + } + + public static function get_top_beeps($limit, $offset = 0) { + global $wpdb; + $likes = Beep_Likes::table_name(); + return $wpdb->get_results($wpdb->prepare( + "SELECT p.*, COALESCE(l.cnt, 0) AS like_count + FROM {$wpdb->posts} p + LEFT JOIN ( + SELECT post_id, COUNT(*) AS cnt + FROM $likes + WHERE object_type = 'post' + GROUP BY post_id + ) l ON l.post_id = p.ID + WHERE p.post_type = %s AND p.post_status = 'publish' + ORDER BY COALESCE(l.cnt, 0) DESC, p.post_date DESC + LIMIT %d OFFSET %d", + Beep_CPT::POST_TYPE, $limit, $offset + )); + } + + public static function render_feed($atts) { + $atts = shortcode_atts([ + 'limit' => 50, + 'header' => 'Beep!', + 'show_wordmark' => true, + 'sort' => 'latest', + ], $atts, 'beep_feed'); + + $limit = max(1, (int) $atts['limit']); + $sort = ($atts['sort'] === 'top') ? 'top' : 'latest'; + $posts = ($sort === 'top') ? self::get_top_beeps($limit) : self::get_latest_beeps($limit); + $has_posts = !empty($posts); + + ob_start(); + ?> +
+
+
+
Messages from Beep!
+
+ + +
+ + +
+ + + + +
+ 64, 'fill' => '#4a90c4'] ); + echo '
' . $empty_bird . '

No beeps yet.

Be the first to share something!
'; + } + ?> +
+
+
+ \d+)', [ + 'methods' => 'POST', + 'callback' => [__CLASS__, 'upload_media'], + 'permission_callback' => function () { + return is_user_logged_in() && !beep_user_is_banned(get_current_user_id()); + }, + ]); + register_rest_route('beep/v1', '/media/(?P\d+)/(?P\d+)', [ + 'methods' => 'DELETE', + 'callback' => [__CLASS__, 'delete_media'], + 'permission_callback' => function () { + return is_user_logged_in() && !beep_user_is_banned(get_current_user_id()); + }, + ]); + register_rest_route('beep/v1', '/voice/(?P\d+)', [ + 'methods' => 'POST', + 'callback' => [__CLASS__, 'upload_voice'], + 'permission_callback' => function () { + return is_user_logged_in() && !beep_user_is_banned(get_current_user_id()); + }, + ]); + } + + public static function upload_media($request) { + $post_id = (int) $request->get_param('post_id'); + $post = get_post($post_id); + + if (!$post || $post->post_type !== Beep_CPT::POST_TYPE) { + return new WP_Error('not_found', 'Beep not found.', 404); + } + if (!current_user_can('edit_post', $post_id)) { + return new WP_Error('forbidden', 'Cannot edit this beep.', 403); + } + if (empty($_FILES['file'])) { + return new WP_Error('no_file', 'No file uploaded.'); + } + + $result = Beep_Media::handle_upload($post_id, $_FILES['file']); + if (is_wp_error($result)) { + return $result; + } + return rest_ensure_response($result); + } + + public static function delete_media($request) { + $post_id = (int) $request->get_param('post_id'); + $attachment_id = (int) $request->get_param('attachment_id'); + $post = get_post($post_id); + + if (!$post || $post->post_type !== Beep_CPT::POST_TYPE) { + return new WP_Error('not_found', 'Beep not found.', 404); + } + if (!current_user_can('edit_post', $post_id)) { + return new WP_Error('forbidden', 'Cannot edit this beep.', 403); + } + + Beep_Media::remove_image($post_id, $attachment_id); + return rest_ensure_response(['ok' => true]); + } + public static function upload_voice($request) { + $post_id = (int) $request->get_param('post_id'); + $post = get_post($post_id); + + if (!$post || $post->post_type !== Beep_CPT::POST_TYPE) { + return new WP_Error('not_found', 'Beep not found.', 404); + } + if (!current_user_can('edit_post', $post_id)) { + return new WP_Error('forbidden', 'Cannot edit this beep.', 403); + } + if (empty($_FILES['file'])) { + return new WP_Error('no_file', 'No file uploaded.'); + } + + $result = Beep_Media::handle_voice_upload($post_id, $_FILES['file']); + if (is_wp_error($result)) { + return $result; + } + return rest_ensure_response($result); + } + + + public static function register_thread_routes() { + register_rest_route('beep/v1', '/thread/(?P\d+)', [ + 'methods' => 'GET', + 'callback' => [__CLASS__, 'get_thread'], + 'permission_callback' => '__return_true', + ]); + } + + public static function get_thread($request) { + $post_id = (int) $request->get_param('post_id'); + if (get_post_type($post_id) !== Beep_CPT::POST_TYPE) { + return new WP_Error('not_found', 'Beep not found.', 404); + } + $depth = (int) $request->get_param('depth') ?: 10; + $thread = Beep_Replies::get_thread($post_id, 0, $depth); + return rest_ensure_response($thread); + } + + public static function register_quote_routes() { + register_rest_route('beep/v1', '/quote/(?P\d+)', [ + 'methods' => 'GET', + 'callback' => [__CLASS__, 'get_quoted_post'], + 'permission_callback' => '__return_true', + ]); + register_rest_route('beep/v1', '/lookup', [ + 'methods' => 'GET', + 'callback' => [__CLASS__, 'lookup_beep'], + 'permission_callback' => '__return_true', + ]); + } + + public static function get_quoted_post($request) { + $post_id = (int) $request->get_param('post_id'); + $quoted = Beep_Quotes::get_quoted_post($post_id); + if (!$quoted) { + return new WP_Error('not_found', 'No quoted post found.', 404); + } + return rest_ensure_response($quoted); + } + + public static function lookup_beep($request) { + $query = sanitize_text_field($request->get_param('q')); + if (!$query) { + return new WP_Error('missing_query', 'Query parameter q is required.', 400); + } + if (is_numeric($query)) { + $post = get_post((int) $query); + if ($post && $post->post_type === Beep_CPT::POST_TYPE) { + return rest_ensure_response(Beep_Quotes::get_quoted_post($post->ID)); + } + } + if (preg_match('/\[beep:(\d+)\]/', $query, $m)) { + $post = get_post((int) $m[1]); + if ($post && $post->post_type === Beep_CPT::POST_TYPE) { + return rest_ensure_response(Beep_Quotes::get_quoted_post($post->ID)); + } + } + return new WP_Error('not_found', 'Beep not found.', 404); + } +} diff --git a/includes/class-shortcode.php.bak b/includes/class-shortcode.php.bak new file mode 100755 index 0000000..8fd52c4 --- /dev/null +++ b/includes/class-shortcode.php.bak @@ -0,0 +1,292 @@ + 'GET', + 'callback' => [__CLASS__, 'fetch_feed'], + 'permission_callback' => '__return_true', + 'args' => [ + 'sort' => ['default' => 'latest'], + 'limit' => ['default' => 50, 'validate_callback' => function ($v) { return is_numeric($v); }], + 'offset' => ['default' => 0, 'validate_callback' => function ($v) { return is_numeric($v); }], + ], + ]); + } + + /** + * REST endpoint: re-render the feed list with the given sort. + */ + public static function fetch_feed($request) { + $sort = $request->get_param('sort') === 'top' ? 'top' : 'latest'; + $limit = max(1, (int) $request->get_param('limit')); + $offset = max(0, (int) $request->get_param('offset')); + $posts = ($sort === 'top') ? self::get_top_beeps($limit + 1, $offset) : self::get_latest_beeps($limit + 1, $offset); + + $has_more = count($posts) > $limit; + if ($has_more) { + $posts = array_slice($posts, 0, $limit); + } + + $html = ''; + foreach ($posts as $p) { + $html .= beep_render_post($p); + } + if ($html === '' && $offset === 0) { + $empty_bird = beep_bird_svg( ['size' => 64, 'fill' => '#4a90c4'] ); + $html = '
' . $empty_bird . '

No beeps yet.

Be the first to share something!
'; + } + return rest_ensure_response(['html' => $html, 'sort' => $sort, 'has_more' => $has_more, 'offset' => $offset + count($posts)]); + } + + public static function get_latest_beeps($limit, $offset = 0) { + global $wpdb; + return $wpdb->get_results($wpdb->prepare( + "SELECT * FROM {$wpdb->posts} + WHERE post_type = %s AND post_status = 'publish' + ORDER BY post_date DESC + LIMIT %d OFFSET %d", + Beep_CPT::POST_TYPE, $limit, $offset + )); + } + + public static function get_top_beeps($limit, $offset = 0) { + global $wpdb; + $likes = Beep_Likes::table_name(); + return $wpdb->get_results($wpdb->prepare( + "SELECT p.*, COALESCE(l.cnt, 0) AS like_count + FROM {$wpdb->posts} p + LEFT JOIN ( + SELECT post_id, COUNT(*) AS cnt + FROM $likes + WHERE object_type = 'post' + GROUP BY post_id + ) l ON l.post_id = p.ID + WHERE p.post_type = %s AND p.post_status = 'publish' + ORDER BY COALESCE(l.cnt, 0) DESC, p.post_date DESC + LIMIT %d OFFSET %d", + Beep_CPT::POST_TYPE, $limit, $offset + )); + } + + public static function render_feed($atts) { + $atts = shortcode_atts([ + 'limit' => 50, + 'header' => 'Beep!', + 'show_wordmark' => true, + 'sort' => 'latest', + ], $atts, 'beep_feed'); + + $limit = max(1, (int) $atts['limit']); + $sort = ($atts['sort'] === 'top') ? 'top' : 'latest'; + $posts = ($sort === 'top') ? self::get_top_beeps($limit) : self::get_latest_beeps($limit); + $has_posts = !empty($posts); + + ob_start(); + ?> +
+
+
+
Messages from Beep!
+
+ + +
+ + +
+ + + + + +
+ Your account has been suspended from beeping. +
+ + + + +
+ 64, 'fill' => '#4a90c4'] ); + echo '
' . $empty_bird . '

No beeps yet.

Be the first to share something!
'; + } + ?> +
+
+
+ \d+)', [ + 'methods' => 'POST', + 'callback' => [__CLASS__, 'upload_media'], + 'permission_callback' => function () { + return is_user_logged_in() && !beep_user_is_banned(get_current_user_id()); + }, + ]); + register_rest_route('beep/v1', '/media/(?P\d+)/(?P\d+)', [ + 'methods' => 'DELETE', + 'callback' => [__CLASS__, 'delete_media'], + 'permission_callback' => function () { + return is_user_logged_in() && !beep_user_is_banned(get_current_user_id()); + }, + ]); + register_rest_route('beep/v1', '/voice/(?P\d+)', [ + 'methods' => 'POST', + 'callback' => [__CLASS__, 'upload_voice'], + 'permission_callback' => function () { + return is_user_logged_in() && !beep_user_is_banned(get_current_user_id()); + }, + ]); + } + + public static function upload_media($request) { + $post_id = (int) $request->get_param('post_id'); + $post = get_post($post_id); + + if (!$post || $post->post_type !== Beep_CPT::POST_TYPE) { + return new WP_Error('not_found', 'Beep not found.', 404); + } + if (!current_user_can('edit_post', $post_id)) { + return new WP_Error('forbidden', 'Cannot edit this beep.', 403); + } + if (empty($_FILES['file'])) { + return new WP_Error('no_file', 'No file uploaded.'); + } + + $result = Beep_Media::handle_upload($post_id, $_FILES['file']); + if (is_wp_error($result)) { + return $result; + } + return rest_ensure_response($result); + } + + public static function delete_media($request) { + $post_id = (int) $request->get_param('post_id'); + $attachment_id = (int) $request->get_param('attachment_id'); + $post = get_post($post_id); + + if (!$post || $post->post_type !== Beep_CPT::POST_TYPE) { + return new WP_Error('not_found', 'Beep not found.', 404); + } + if (!current_user_can('edit_post', $post_id)) { + return new WP_Error('forbidden', 'Cannot edit this beep.', 403); + } + + Beep_Media::remove_image($post_id, $attachment_id); + return rest_ensure_response(['ok' => true]); + } + public static function upload_voice($request) { + $post_id = (int) $request->get_param('post_id'); + $post = get_post($post_id); + + if (!$post || $post->post_type !== Beep_CPT::POST_TYPE) { + return new WP_Error('not_found', 'Beep not found.', 404); + } + if (!current_user_can('edit_post', $post_id)) { + return new WP_Error('forbidden', 'Cannot edit this beep.', 403); + } + if (empty($_FILES['file'])) { + return new WP_Error('no_file', 'No file uploaded.'); + } + + $result = Beep_Media::handle_voice_upload($post_id, $_FILES['file']); + if (is_wp_error($result)) { + return $result; + } + return rest_ensure_response($result); + } + + + public static function register_thread_routes() { + register_rest_route('beep/v1', '/thread/(?P\d+)', [ + 'methods' => 'GET', + 'callback' => [__CLASS__, 'get_thread'], + 'permission_callback' => '__return_true', + ]); + } + + public static function get_thread($request) { + $post_id = (int) $request->get_param('post_id'); + if (get_post_type($post_id) !== Beep_CPT::POST_TYPE) { + return new WP_Error('not_found', 'Beep not found.', 404); + } + $depth = (int) $request->get_param('depth') ?: 10; + $thread = Beep_Replies::get_thread($post_id, 0, $depth); + return rest_ensure_response($thread); + } + + public static function register_quote_routes() { + register_rest_route('beep/v1', '/quote/(?P\d+)', [ + 'methods' => 'GET', + 'callback' => [__CLASS__, 'get_quoted_post'], + 'permission_callback' => '__return_true', + ]); + register_rest_route('beep/v1', '/lookup', [ + 'methods' => 'GET', + 'callback' => [__CLASS__, 'lookup_beep'], + 'permission_callback' => '__return_true', + ]); + } + + public static function get_quoted_post($request) { + $post_id = (int) $request->get_param('post_id'); + $quoted = Beep_Quotes::get_quoted_post($post_id); + if (!$quoted) { + return new WP_Error('not_found', 'No quoted post found.', 404); + } + return rest_ensure_response($quoted); + } + + public static function lookup_beep($request) { + $query = sanitize_text_field($request->get_param('q')); + if (!$query) { + return new WP_Error('missing_query', 'Query parameter q is required.', 400); + } + if (is_numeric($query)) { + $post = get_post((int) $query); + if ($post && $post->post_type === Beep_CPT::POST_TYPE) { + return rest_ensure_response(Beep_Quotes::get_quoted_post($post->ID)); + } + } + if (preg_match('/\[beep:(\d+)\]/', $query, $m)) { + $post = get_post((int) $m[1]); + if ($post && $post->post_type === Beep_CPT::POST_TYPE) { + return rest_ensure_response(Beep_Quotes::get_quoted_post($post->ID)); + } + } + return new WP_Error('not_found', 'Beep not found.', 404); + } +} diff --git a/includes/helpers.php b/includes/helpers.php new file mode 100755 index 0000000..82241e2 --- /dev/null +++ b/includes/helpers.php @@ -0,0 +1,589 @@ +' + . '' + . '' + . '' + . ''; +} + +/** + * Wordmark (bird + "Beep!") shown at the top of the feed. + * Uses the real Sami-designed bird PNG with CSS color filter + * to match brand colours. + */ +function beep_logo_svg() { + // Allow site-owners to swap in a custom logo via settings. + $custom = Beep_Settings::get( 'logo_url' ); + if ( $custom ) { + return ''; + } + + // Real bird PNG as — CSS filter turns black silhouette → brand blue. + $filter = 'brightness(0) saturate(100%) invert(30%) sepia(100%) saturate(10000%) hue-rotate(190deg)'; + return ''; +} + +/** + * Is this user banned from posting/liking/replying? + */ +function beep_user_is_banned($user_id) { + if (!$user_id) { + return false; + } + return get_user_meta($user_id, 'beep_banned', true) === '1'; +} + +/** + * Render the composer textarea (for logged-in, non-banned users). + */ +function beep_render_composer() { + $user = wp_get_current_user(); + $beep_avatar = get_user_meta($post->post_author, 'beep_avatar', true); + if ($beep_avatar) { + $avatar_url = $beep_avatar; + $filter = ''; + } elseif ($author && !empty($author->user_email)) { + $avatar_url = 'https://www.gravatar.com/avatar/' . md5(strtolower($author->user_email)) . '?s=96&d=mp'; + $filter = ''; + } else { + $avatar_url = BEEP_URL . 'assets/beep-bird.png'; + $filter = 'brightness(0) saturate(100%) invert(22%) sepia(100%) saturate(10000%) hue-rotate(190deg)'; + } + $avatar = ''; + + ob_start(); + ?> +
+ +
+ + +
+ + +
+ post_author); + $beep_avatar = get_user_meta($post->post_author, 'beep_avatar', true); + if ($beep_avatar) { + $avatar_url = $beep_avatar; + $filter = ''; + } elseif ($author && !empty($author->user_email)) { + $avatar_url = 'https://www.gravatar.com/avatar/' . md5(strtolower($author->user_email)) . '?s=96&d=mp'; + $filter = ''; + } else { + $avatar_url = BEEP_URL . 'assets/beep-bird.png'; + $filter = 'brightness(0) saturate(100%) invert(22%) sepia(100%) saturate(10000%) hue-rotate(190deg)'; + } + $avatar = ''; + $name = $author ? esc_html($author->display_name) : 'Unknown'; + $handle = $author ? '@' . esc_html($author->user_login) : ''; + $ts = strtotime($post->post_date_gmt . ' UTC'); + $time = beep_relative_time($ts); + $time_iso = gmdate('c', $ts); + $time_full = mysql2date('F j, Y g:i a', $post->post_date); + + $content = beep_format_content($post->post_content); + $like_count = Beep_Likes::get_count($post->ID, 'post'); + $reply_count = Beep_Replies::reply_count($post->ID); + $user_liked = Beep_Likes::user_has_liked($post->ID, 'post'); + $can_delete = current_user_can('delete_post', $post->ID); + $can_interact = is_user_logged_in() && !beep_user_is_banned(get_current_user_id()); + $beep_images = Beep_Media::get_images($post->ID); + $beep_video = Beep_Media::get_video_url($post->ID); + $beep_voice = Beep_Media::get_voice_url($post->ID); + + ob_start(); + ?> +
+ +
+
+ 18, 'fill' => '#0064cd', 'class' => 'beep-post-badge'] ); ?> + + + + + · + + +
+
+ +
+ +
+ + +
+ +
+ + +
+ ID); ?> +
+ + ID); + ?> + +
+ ID); ?> +
+ + ID, 'beep_gif_url', true); + ?> + +
+
+ GIF +
+
+ + ID); + if ($poll) : ?> +
+
+
+ + +
+
+ + + % + +
+ + + + +
+
+ votes + + + Final results + + · Ends + + +
+
+ +
+ + + + + + +
+ + + +
+ + + + Beep! +
+ + + ID, 0); ?> + + +
+ ID); + echo beep_render_replies_tree($all, 0, 0, $post->ID, $can_interact); + ?> +
+ Beep! +
+
+ + + comment_parent !== (int) $parent_id) { + continue; + } + $out .= beep_render_reply($c, $comments, $depth, $post_id, $can_interact); + } + return $out; +} + +/** + * Render a single reply, plus its nested children. + */ +function beep_render_reply($comment, $all_comments = [], $depth = 0, $post_id = 0, $can_interact = false) { + if (!$comment) { + return ''; + } + + $author_id = (int) $comment->user_id; + $avatar_url = BEEP_URL . 'assets/beep-bird.png'; + $filter = 'brightness(0) saturate(100%) invert(22%) sepia(100%) saturate(10000%) hue-rotate(190deg)'; + $avatar = ''; + + $author = $author_id ? get_userdata($author_id) : null; + $name = $author ? esc_html($author->display_name) : esc_html($comment->comment_author); + $handle = $author ? '@' . esc_html($author->user_login) : ''; + + $ts = strtotime($comment->comment_date_gmt . ' UTC'); + $time = beep_relative_time($ts); + $time_iso = gmdate('c', $ts); + + $content = beep_format_content($comment->comment_content); + $can_delete = current_user_can('moderate_comments'); + $like_count = Beep_Likes::get_count($comment->comment_ID, 'reply'); + $user_liked = Beep_Likes::user_has_liked($comment->comment_ID, 'reply'); + + $depth_class = 'beep-depth-' . min((int) $depth, 2); + + ob_start(); + ?> +
+ +
+
+ 16, 'fill' => '#0064cd', 'class' => 'beep-post-badge beep-post-badge-sm'] ); ?> + + + + + · + + + 16, 'fill' => '#0064cd', 'class' => 'beep-post-badge beep-post-badge-sm'] ); ?> +
+
+ + +
+ + +
+ comment_ID); ?> + + +
+ +
+ + + comment_ID, $depth + 1, $post_id, $can_interact); + if ($children) { + echo '
' . $children . '
'; + } + ?> +
+
+ #' . esc_html($m[2]) . ''; + }, $text); + // @mentions + $text = preg_replace_callback('/(^|\s)@([a-zA-Z0-9_]+)/', function ($m) { + $user = get_user_by('login', $m[2]); + if ($user) { + return $m[1] . '@' . esc_html($m[2]) . ''; + } + return $m[1] . '@' . esc_html($m[2]) . ''; + }, $text); + // URLs + $text = preg_replace_callback('#(https?://[^\s<]+)#i', function ($m) { + $url = esc_url($m[1]); + $display = parse_url($url, PHP_URL_HOST); + if (!$display) { + $display = $url; + } + return '' . esc_html($display) . ''; + }, $text); + // Line breaks + $text = nl2br($text); + return $text; +} + +function beep_relative_time($timestamp) { + $now = time(); + $diff = $now - $timestamp; + if ($diff < 0) { + $diff = 0; + } + if ($diff < 60) { + return $diff . 's'; + } + if ($diff < 3600) { + return floor($diff / 60) . 'm'; + } + if ($diff < 86400) { + return floor($diff / 3600) . 'h'; + } + if ($diff < 604800) { + return floor($diff / 86400) . 'd'; + } + return gmdate('M j', $timestamp); +} + +function beep_icon($name) { + $icons = [ + 'reply' => '', + 'heart' => '', + 'heart_filled' => '', + 'share' => '', + 'beep_bird' => '', + ]; + return isset($icons[$name]) ? $icons[$name] : ''; +} + + +/** + * Render the thread/conversation modal (sits outside individual posts). + */ +function beep_render_thread_modal() { + return ''; +} + + +/** + * Render the GIF picker modal. + */ +function beep_render_gif_modal() { + return ''; +} diff --git a/readme.txt b/readme.txt new file mode 100755 index 0000000..f73f93c --- /dev/null +++ b/readme.txt @@ -0,0 +1,81 @@ +=== Beep === +Contributors: sami +Tags: microblog, twitter, tweets, social, comments, polls, elementor +Requires at least: 6.0 +Tested up to: 6.9 +Requires PHP: 7.4 +Stable tag: 1.6.0 +License: GPLv2 or later + +A Twitter-style microblog for WordPress. Posts, likes, replies, polls, quotes, GIFs, and Gravatars. Use [beep_feed] shortcode or Elementor widget. + +== Description == + +Beep adds a Twitter-style microblog to your WordPress site. Drop the +[beep_feed] shortcode on any page or use the Elementor widget. Likes, +threaded replies, polls, quotes, GIFs, and Latest/Top sort tabs are all built in. + +Features: +* Twitter-style feed with [beep_feed] shortcode +* Elementor drag-and-drop widget +* Polls (create and vote) +* Quote posts +* GIF picker (Giphy integration) +* Likes on beeps and replies +* Nested threaded replies +* Gravatar avatars +* Admin settings page (Settings > Beep) +* Customizable colors and branding via CSS variables +* Bird-themed branding with custom icons + +== Installation == + +1. Upload beep.zip via Plugins -> Add New -> Upload Plugin. Activate. +2. Add [beep_feed] to a page, or use the Elementor widget. +3. For multi-user signup, enable "Anyone can register" in Settings -> General. + +== Shortcode == + +[beep_feed limit="50" header="Messages from" sort="latest"] + +== Changelog == + += 1.6.0 = +* Elementor drag-and-drop widget for feed placement. +* Admin settings page (Settings > Beep) for Giphy API key and branding. +* Polls: create polls in beeps, vote on polls. +* Quote posts: quote any beep. +* GIF picker powered by Giphy. +* Bird-themed redesign with custom bird icons and badges. +* CSS variables for customizable colors. +* Elementor widget registration. +* Settings stored in wp_options. + += 1.5.1 = +* Twitter-style UI redesign with bird assets. +* Beep bird badge on posts and replies. +* CSS scope isolation improvements. + += 1.5.0 = +* Polls feature (Beep_Polls class, voting UI). +* Bird wordmark logo in header. + += 1.4.0 = +* Like replies, not just beeps. +* Nested replies (reply to replies, indented up to two levels). +* Latest / Top sort tabs at the top of the feed. +* Bird badge in the top-right of every beep and reply. +* Polished tabs, focus states, action button styling. + += 1.3.0 = +* Feed header reads "Messages from" + Beep wordmark. +* Avatar/textarea fixes baked in. + += 1.2.0 = +* Feed header shows Beep wordmark instead of small icon + Home text. + += 1.1.0 = +* New hand-drawn bird logo. + += 1.0.0 = +* Initial release. From fbf7ea93edc26b659ef1ece5415fbf4e1bb10bca Mon Sep 17 00:00:00 2001 From: Sami Ahmed Date: Sun, 7 Jun 2026 01:51:14 -0700 Subject: [PATCH 2/3] v1.7.0: shortcode-only, remove auto-inject --- beep.php | 4 ++-- includes/class-beep.php | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/beep.php b/beep.php index a2288cd..c8a9117 100755 --- a/beep.php +++ b/beep.php @@ -2,7 +2,7 @@ /** * Plugin Name: Beep * Description: A Twitter-style microblog for WordPress, with likes, replies, and Gravatars. Use the [beep_feed] shortcode on any page. - * Version: 1.6.8 + * Version: 1.7.0 * Requires at least: 6.0 * Requires PHP: 7.4 * Author: Sami Ahmed @@ -14,7 +14,7 @@ if (!defined('ABSPATH')) { exit; } -define('BEEP_VERSION', '1.6.8'); +define('BEEP_VERSION', '1.7.0'); define('BEEP_FILE', __FILE__); define('BEEP_DIR', plugin_dir_path(__FILE__)); define('BEEP_URL', plugin_dir_url(__FILE__)); diff --git a/includes/class-beep.php b/includes/class-beep.php index 94cd2a3..14f5449 100755 --- a/includes/class-beep.php +++ b/includes/class-beep.php @@ -22,12 +22,12 @@ class Beep_Plugin { // Elementor widget — only load if Elementor is active add_action('elementor/widgets/register', function ($widgets_manager) { - if (!class_exists('\Elementor\Widget_Base')) return; + if (!class_exists('\\Elementor\\Widget_Base')) return; $widget_file = BEEP_DIR . 'includes/class-elementor-widget.php'; if (!file_exists($widget_file)) return; require_once $widget_file; - if (class_exists('\Elementor\Beep_Elementor_Widget')) { - $widgets_manager->register(new \Elementor\Beep_Elementor_Widget()); + if (class_exists('\\Elementor\\Beep_Elementor_Widget')) { + $widgets_manager->register(new \\Elementor\\Beep_Elementor_Widget()); } }, 5); @@ -35,6 +35,18 @@ class Beep_Plugin { add_action('admin_menu', [__CLASS__, 'add_admin_menu']); add_action('admin_init', [__CLASS__, 'register_settings']); } + // Don't inject in feeds, REST, admin, etc. + if (is_feed() || is_admin() || (defined('REST_REQUEST') && REST_REQUEST)) { + return $content; + } + // Don't double-inject if content already has a beep feed + if (strpos($content, 'data-beep-feed') !== false) { + return $content; + } + + $feed = do_shortcode('[beep_feed limit="10"]'); + return $feed . $content; + } public static function add_admin_menu() { add_options_page( From 9ce1cff8b89c02af03bb268c88cacb2d707086a9 Mon Sep 17 00:00:00 2001 From: Sami Ahmed Date: Sun, 7 Jun 2026 02:30:05 -0700 Subject: [PATCH 3/3] fix: remove orphaned auto_inject code causing fatal error --- includes/class-beep.php | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/includes/class-beep.php b/includes/class-beep.php index 14f5449..6fec7e4 100755 --- a/includes/class-beep.php +++ b/includes/class-beep.php @@ -21,13 +21,13 @@ class Beep_Plugin { } // Elementor widget — only load if Elementor is active - add_action('elementor/widgets/register', function ($widgets_manager) { - if (!class_exists('\\Elementor\\Widget_Base')) return; + add_action('elementor/widgets/register', function () { + if (!class_exists('\Elementor\Widget_Base')) return; $widget_file = BEEP_DIR . 'includes/class-elementor-widget.php'; if (!file_exists($widget_file)) return; require_once $widget_file; - if (class_exists('\\Elementor\\Beep_Elementor_Widget')) { - $widgets_manager->register(new \\Elementor\\Beep_Elementor_Widget()); + if (class_exists('\Elementor\Beep_Elementor_Widget')) { + $widgets_manager->register(new \Elementor\Beep_Elementor_Widget()); } }, 5); @@ -35,18 +35,6 @@ class Beep_Plugin { add_action('admin_menu', [__CLASS__, 'add_admin_menu']); add_action('admin_init', [__CLASS__, 'register_settings']); } - // Don't inject in feeds, REST, admin, etc. - if (is_feed() || is_admin() || (defined('REST_REQUEST') && REST_REQUEST)) { - return $content; - } - // Don't double-inject if content already has a beep feed - if (strpos($content, 'data-beep-feed') !== false) { - return $content; - } - - $feed = do_shortcode('[beep_feed limit="10"]'); - return $feed . $content; - } public static function add_admin_menu() { add_options_page(