diff --git a/docker-compose.yml b/docker-compose.yml index ad40d3762..d0bcac72e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ services: environment: - DATABASE_URL=postgresql://postgres@postgres:5432 - REDIS_URL=redis://redis - - OPERA_URL=http://opera-proxy:18080 + - PROXY_URL=http://opera-proxy:18080 links: - "redis" - "postgres" diff --git a/env b/env index 5148d6ff6..0682d723b 100644 --- a/env +++ b/env @@ -1,12 +1,14 @@ FLASK_APP=/rDrama/files/cli:app -MASTER_KEY=blahblahblah DOMAIN=localhost SITE_NAME=rDrama +MASTER_KEY=blahblahblah +PROXY_URL=http://localhost:18080 GIPHY_KEY=blahblahblah DISCORD_SERVER_ID=blahblahblah DISCORD_CLIENT_ID=blahblahblah DISCORD_CLIENT_SECRET=blahblahblah DISCORD_BOT_TOKEN=blahblahblah +HCAPTCHA_SITEKEY=blahblahblah HCAPTCHA_SECRET=blahblahblah YOUTUBE_KEY=blahblahblah PUSHER_ID=blahblahblah @@ -25,7 +27,7 @@ CARD_VIEW=0 DISABLE_DOWNVOTES=0 DUES=0 DEFAULT_THEME=midnight -DEFAULT_COLOR=ff66ac +DEFAULT_COLOR=805ad5 MAIL_USERNAME=blahblahblah@gmail.com MAIL_PASSWORD=blahblahblah DESCRIPTION=rdrama.net caters to drama in all forms such as: Real life, videos, photos, gossip, rumors, news sites, Reddit, and Beyond™. There isn't drama we won't touch, and we want it all! diff --git a/files/classes/submission.py b/files/classes/submission.py index eb880cb29..4d10ce8e7 100644 --- a/files/classes/submission.py +++ b/files/classes/submission.py @@ -416,7 +416,7 @@ class Submission(Base): def realtitle(self, v): if self.club and not (v and (v.paid_dues or v.id == self.author_id)): if v: return random.choice(TROLLTITLES).format(username=v.username) - elif dues == -2: return f'Please make an account to see this post' + elif DUES == -2: return f'Please make an account to see this post' else: return f'{CC} MEMBERS ONLY' elif self.title_html: title = self.title_html else: title = self.title diff --git a/files/classes/user.py b/files/classes/user.py index 717dac50a..e31506639 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -417,7 +417,7 @@ class User(Base): if not FEATURES['COUNTRY_CLUB']: return True if self.shadowbanned: return False if self.is_suspended_permanently: return False - return self.admin_level >= PERMS['VIEW_CLUB'] or self.club_allowed or (self.club_allowed != False and self.truecoins >= dues) + return self.admin_level >= PERMS['VIEW_CLUB'] or self.club_allowed or (self.club_allowed != False and self.truecoins >= DUES) @lazy def any_block_exists(self, other): diff --git a/files/helpers/const.py b/files/helpers/const.py index 262876cf5..1d2c6b0d7 100644 --- a/files/helpers/const.py +++ b/files/helpers/const.py @@ -9,8 +9,48 @@ from flask import request import tldextract from os import path -SITE = environ.get("DOMAIN", '').strip() -SITE_NAME = environ.get("SITE_NAME", '').strip() + +SITE = environ.get("DOMAIN").strip() +SITE_NAME = environ.get("SITE_NAME").strip() +MASTER_KEY = environ.get("MASTER_KEY").strip() +PROXY_URL = environ.get("PROXY_URL").strip() +GIPHY_KEY = environ.get('GIPHY_KEY').strip() +DISCORD_SERVER_ID = environ.get("DISCORD_SERVER_ID").strip() +DISCORD_CLIENT_ID = environ.get("DISCORD_CLIENT_ID").strip() +DISCORD_CLIENT_SECRET = environ.get("DISCORD_CLIENT_SECRET").strip() +DISCORD_BOT_TOKEN = environ.get("DISCORD_BOT_TOKEN").strip() +HCAPTCHA_SITEKEY = environ.get("HCAPTCHA_SITEKEY").strip() +HCAPTCHA_SECRET = environ.get("HCAPTCHA_SECRET").strip() +YOUTUBE_KEY = environ.get("YOUTUBE_KEY").strip() +PUSHER_ID = environ.get("PUSHER_ID").strip() +PUSHER_KEY = environ.get("PUSHER_KEY").strip() +IMGUR_KEY = environ.get("IMGUR_KEY").strip() +SPAM_SIMILARITY_THRESHOLD = float(environ.get("SPAM_SIMILARITY_THRESHOLD").strip()) +SPAM_URL_SIMILARITY_THRESHOLD = float(environ.get("SPAM_URL_SIMILARITY_THRESHOLD").strip()) +SPAM_SIMILAR_COUNT_THRESHOLD = int(environ.get("SPAM_SIMILAR_COUNT_THRESHOLD").strip()) +COMMENT_SPAM_SIMILAR_THRESHOLD = float(environ.get("COMMENT_SPAM_SIMILAR_THRESHOLD").strip()) +COMMENT_SPAM_COUNT_THRESHOLD = int(environ.get("COMMENT_SPAM_COUNT_THRESHOLD").strip()) +DEFAULT_TIME_FILTER = environ.get("DEFAULT_TIME_FILTER").strip() +GUMROAD_TOKEN = environ.get("GUMROAD_TOKEN").strip() +GUMROAD_LINK = environ.get("GUMROAD_LINK").strip() +GUMROAD_ID = environ.get("GUMROAD_ID").strip() +CARD_VIEW = bool(int(environ.get("CARD_VIEW").strip())) +DISABLE_DOWNVOTES = bool(int(environ.get("DISABLE_DOWNVOTES").strip())) +DUES = int(environ.get("DUES").strip()) +DEFAULT_THEME = environ.get("DEFAULT_THEME").strip() +DEFAULT_COLOR = environ.get("DEFAULT_COLOR", "805ad5").strip() +MAIL_USERNAME = environ.get("MAIL_USERNAME").strip() +DESCRIPTION = environ.get("DESCRIPTION").strip() +CF_KEY = environ.get("CF_KEY").strip() +CF_ZONE = environ.get("CF_ZONE").strip() + +GLOBAL = environ.get("GLOBAL", "").strip() +blackjack = environ.get("BLACKJACK", "").strip() +FP = environ.get("FP", "").strip() +KOFI_TOKEN = environ.get("KOFI_TOKEN", "").strip() +KOFI_LINK = environ.get("KOFI_LINK", "").strip() + + if SITE == "localhost": SITE_FULL = 'http://' + SITE else: SITE_FULL = 'https://' + SITE @@ -391,10 +431,6 @@ else: # localhost or testing environment implied bots = {AUTOJANNY_ID, SNAPPY_ID, LONGPOSTBOT_ID, ZOZBOT_ID, BASEDBOT_ID} -IMGUR_KEY = environ.get("IMGUR_KEY").strip() -PUSHER_ID = environ.get("PUSHER_ID", "").strip() -PUSHER_KEY = environ.get("PUSHER_KEY", "").strip() -DEFAULT_COLOR = environ.get("DEFAULT_COLOR", "805ad5").strip() COLORS = {'ff66ac','805ad5','62ca56','38a169','80ffff','2a96f3','eb4963','ff0000','f39731','30409f','3e98a7','e4432d','7b9ae4','ec72de','7f8fa6', 'f8db58','8cdbe6', DEFAULT_COLOR} AWARDS = { @@ -984,14 +1020,10 @@ discounts = { 78: 0.01, } -CF_KEY = environ.get("CF_KEY", "").strip() -CF_ZONE = environ.get("CF_ZONE", "").strip() CF_HEADERS = {"Authorization": f"Bearer {CF_KEY}", "Content-Type": "application/json"} WORDLE_LIST = ('aaron','about','above','abuse','acids','acres','actor','acute','adams','added','admin','admit','adopt','adult','after','again','agent','aging','agree','ahead','aimed','alarm','album','alert','alias','alice','alien','align','alike','alive','allah','allan','allen','allow','alloy','alone','along','alpha','alter','amber','amend','amino','among','angel','anger','angle','angry','anime','annex','annie','apart','apple','apply','april','areas','arena','argue','arise','armed','armor','array','arrow','aruba','ascii','asian','aside','asked','asset','atlas','audio','audit','autos','avoid','award','aware','awful','babes','bacon','badge','badly','baker','balls','bands','banks','barry','based','bases','basic','basin','basis','batch','baths','beach','beads','beans','bears','beast','beats','began','begin','begun','being','belle','belly','below','belts','bench','berry','betty','bible','bikes','bills','billy','bingo','birds','birth','bitch','black','blade','blair','blake','blame','blank','blast','blend','bless','blind','blink','block','blogs','blond','blood','bloom','blues','board','boats','bobby','bonds','bones','bonus','boobs','books','boost','booth','boots','booty','bored','bound','boxed','boxes','brain','brake','brand','brass','brave','bread','break','breed','brian','brick','bride','brief','bring','broad','broke','brook','brown','bruce','brush','bryan','bucks','buddy','build','built','bunch','bunny','burke','burns','burst','buses','busty','butts','buyer','bytes','cabin','cable','cache','cakes','calif','calls','camel','camps','canal','candy','canon','cards','carey','cargo','carlo','carol','carry','cases','casey','casio','catch','cause','cedar','cells','cents','chain','chair','chaos','charm','chart','chase','cheap','cheat','check','chess','chest','chevy','chick','chief','child','chile','china','chips','choir','chose','chris','chuck','cindy','cisco','cited','civic','civil','claim','clara','clark','class','clean','clear','clerk','click','cliff','climb','clips','clock','clone','close','cloth','cloud','clubs','coach','coast','cocks','codes','cohen','coins','colin','colon','color','combo','comes','comic','condo','congo','const','coral','corps','costa','costs','could','count','court','cover','crack','craft','craig','craps','crash','crazy','cream','creek','crest','crime','crops','cross','crowd','crown','crude','cubic','curve','cyber','cycle','czech','daddy','daily','dairy','daisy','dance','danny','dated','dates','david','davis','deals','dealt','death','debug','debut','decor','delay','delhi','delta','dense','depot','depth','derby','derek','devel','devil','devon','diana','diane','diary','dicke','dicks','diego','diffs','digit','dildo','dirty','disco','discs','disks','dodge','doing','dolls','donna','donor','doors','doubt','dover','dozen','draft','drain','rDrama','drawn','draws','dream','dress','dried','drill','drink','drive','drops','drove','drugs','drums','drunk','dryer','dubai','dutch','dying','dylan','eagle','early','earth','ebony','ebook','eddie','edgar','edges','egypt','eight','elder','elect','elite','ellen','ellis','elvis','emacs','email','emily','empty','ended','endif','enemy','enjoy','enter','entry','epson','equal','error','essay','essex','euros','evans','event','every','exact','exams','excel','exist','extra','faced','faces','facts','fails','fairy','faith','falls','false','fancy','fares','farms','fatal','fatty','fault','favor','fears','feeds','feels','fence','ferry','fever','fewer','fiber','fibre','field','fifth','fifty','fight','filed','files','filme','films','final','finds','fired','fires','firms','first','fixed','fixes','flags','flame','flash','fleet','flesh','float','flood','floor','flour','flows','floyd','fluid','flush','flyer','focal','focus','folks','fonts','foods','force','forge','forms','forth','forty','forum','found','frame','frank','fraud','fresh','front','frost','fruit','fully','funds','funky','funny','fuzzy','gains','games','gamma','gates','gauge','genes','genre','ghana','ghost','giant','gifts','girls','given','gives','glass','glenn','globe','glory','gnome','goals','going','gonna','goods','gotta','grace','grade','grain','grams','grand','grant','graph','grass','grave','great','greek','green','grill','gross','group','grove','grown','grows','guard','guess','guest','guide','guild','hairy','haiti','hands','handy','happy','harry','haven','hayes','heads','heard','heart','heath','heavy','helen','hello','helps','hence','henry','herbs','highs','hills','hindu','hints','hired','hobby','holds','holes','holly','homes','honda','honey','honor','hoped','hopes','horny','horse','hosts','hotel','hours','house','human','humor','icons','idaho','ideal','ideas','image','inbox','index','india','indie','inner','input','intel','inter','intro','iraqi','irish','isaac','islam','issue','italy','items','ivory','jacob','james','jamie','janet','japan','jason','jeans','jenny','jerry','jesse','jesus','jewel','jimmy','johns','joins','joint','jokes','jones','joyce','judge','juice','julia','julie','karen','karma','kathy','katie','keeps','keith','kelly','kenny','kenya','kerry','kevin','kills','kinda','kinds','kings','kitty','klein','knife','knock','known','knows','kodak','korea','label','labor','laden','lakes','lamps','lance','lands','lanes','lanka','large','larry','laser','later','latex','latin','laugh','laura','layer','leads','learn','lease','least','leave','leeds','legal','lemon','leone','level','lewis','lexus','light','liked','likes','limit','linda','lined','lines','links','linux','lions','lists','lived','liver','lives','lloyd','loads','loans','lobby','local','locks','lodge','logan','logic','login','logos','looks','loops','loose','lopez','lotus','louis','loved','lover','loves','lower','lucas','lucia','lucky','lunch','lycos','lying','lyric','macro','magic','mails','maine','major','maker','makes','males','malta','mambo','manga','manor','maple','march','marco','mardi','maria','marie','mario','marks','mason','match','maybe','mayor','mazda','meals','means','meant','medal','media','meets','menus','mercy','merge','merit','merry','metal','meter','metro','meyer','miami','micro','might','milan','miles','milfs','mills','minds','mines','minor','minus','mixed','mixer','model','modem','modes','money','monte','month','moore','moral','moses','motel','motor','mount','mouse','mouth','moved','moves','movie','mpegs','msgid','multi','music','myers','nails','naked','named','names','nancy','nasty','naval','needs','nepal','nerve','never','newer','newly','niger','night','nikon','noble','nodes','noise','nokia','north','noted','notes','notre','novel','nurse','nylon','oasis','occur','ocean','offer','often','older','olive','omaha','omega','onion','opens','opera','orbit','order','organ','oscar','other','ought','outer','owned','owner','oxide','ozone','packs','pages','paint','pairs','panel','panic','pants','paper','papua','paris','parks','parts','party','pasta','paste','patch','paths','patio','paxil','peace','pearl','peers','penis','penny','perry','perth','peter','phase','phone','photo','phpbb','piano','picks','piece','pills','pilot','pipes','pitch','pixel','pizza','place','plain','plane','plans','plant','plate','plays','plaza','plots','poems','point','poker','polar','polls','pools','porno','ports','posts','pound','power','press','price','pride','prime','print','prior','prize','probe','promo','proof','proud','prove','proxy','pulse','pumps','punch','puppy','purse','pussy','qatar','queen','query','quest','queue','quick','quiet','quilt','quite','quote','races','racks','radar','radio','raise','rally','ralph','ranch','randy','range','ranks','rapid','rated','rates','ratio','reach','reads','ready','realm','rebel','refer','rehab','relax','relay','remix','renew','reply','reset','retro','rhode','rider','rides','ridge','right','rings','risks','river','roads','robin','robot','rocks','rocky','roger','roles','rolls','roman','rooms','roots','roses','rouge','rough','round','route','rover','royal','rugby','ruled','rules','rural','safer','sagem','saint','salad','salem','sales','sally','salon','samba','samoa','sandy','santa','sanyo','sarah','satin','sauce','saudi','saved','saver','saves','sbjct','scale','scary','scene','scoop','scope','score','scott','scout','screw','scuba','seats','seeds','seeks','seems','sells','sends','sense','serum','serve','setup','seven','shade','shaft','shake','shall','shame','shape','share','shark','sharp','sheep','sheer','sheet','shelf','shell','shift','shine','ships','shirt','shock','shoes','shoot','shops','shore','short','shots','shown','shows','sides','sight','sigma','signs','silly','simon','since','singh','sites','sixth','sized','sizes','skill','skins','skirt','skype','slave','sleep','slide','slope','slots','sluts','small','smart','smell','smile','smith','smoke','snake','socks','solar','solid','solve','songs','sonic','sorry','sorts','souls','sound','south','space','spain','spank','sparc','spare','speak','specs','speed','spell','spend','spent','sperm','spice','spies','spine','split','spoke','sport','spots','spray','squad','stack','staff','stage','stamp','stand','stars','start','state','stats','stays','steal','steam','steel','steps','steve','stick','still','stock','stone','stood','stops','store','storm','story','strap','strip','stuck','study','stuff','style','sucks','sudan','sugar','suite','suits','sunny','super','surge','susan','sweet','swift','swing','swiss','sword','syria','table','tahoe','taken','takes','tales','talks','tamil','tampa','tanks','tapes','tasks','taste','taxes','teach','teams','tears','teddy','teens','teeth','tells','terms','terry','tests','texas','texts','thank','thats','theft','their','theme','there','these','thick','thing','think','third','thong','those','three','throw','thumb','tiger','tight','tiles','timer','times','tions','tired','tires','title','today','token','tokyo','tommy','toner','tones','tools','tooth','topic','total','touch','tough','tours','tower','towns','toxic','trace','track','tract','tracy','trade','trail','train','trans','trash','treat','trees','trend','trial','tribe','trick','tried','tries','trips','trout','truck','truly','trunk','trust','truth','tubes','tulsa','tumor','tuner','tunes','turbo','turns','tvcom','twice','twiki','twins','twist','tyler','types','ultra','uncle','under','union','units','unity','until','upper','upset','urban','usage','users','using','usual','utils','valid','value','valve','vault','vegas','venue','verde','verse','video','views','villa','vinyl','viral','virus','visit','vista','vital','vocal','voice','volvo','voted','votes','vsnet','wages','wagon','wales','walks','walls','wanna','wants','waste','watch','water','watts','waves','wayne','weeks','weird','wells','welsh','wendy','whale','whats','wheat','wheel','where','which','while','white','whole','whore','whose','wider','width','wiley','winds','wines','wings','wired','wires','witch','wives','woman','women','woods','words','works','world','worry','worse','worst','worth','would','wound','wrist','write','wrong','wrote','xanax','xerox','xhtml','yacht','yahoo','yards','years','yeast','yemen','yield','young','yours','youth','yukon','zones','gypsy','etika','funko','abort','gabby','soros','twink','biden','janny','chapo','4chan','tariq','tweet','trump','bussy','sneed','chink','nigga','wigga','caulk','putin','negus','gussy','soren') -dues = int(environ.get("DUES").strip()) - christian_emojis = [':#marseyjesus:',':#marseyimmaculate:',':#marseymothermary:', ':#marseyfatherjoseph:',':#gigachadorthodox:',':#marseyorthodox:',':#marseyorthodoxpat:', ':#marseycrucified:',':#chadjesus:',':#marseyandjesus:',':#marseyjesus2:', @@ -1020,14 +1052,10 @@ if path.isfile(f'snappy_{SITE_NAME}.txt'): with open(f'snappy_{SITE_NAME}.txt', "r", encoding="utf-8") as f: SNAPPY_QUOTES = f.read().split("\n{[para]}\n") -YOUTUBE_KEY = environ.get("YOUTUBE_KEY", "").strip() - ADMIGGERS = {SIDEBAR_THREAD, BANNER_THREAD, BADGE_THREAD, SNAPPY_THREAD} -OPERA_URL = environ.get("OPERA_URL", "http://localhost:18080") -proxies = {"http":OPERA_URL,"https":OPERA_URL} +proxies = {"http":PROXY_URL,"https":PROXY_URL} -blackjack = environ.get("BLACKJACK", "").strip() approved_embed_hosts = { SITE, @@ -1106,33 +1134,6 @@ def is_safe_url(url): hosts = "|".join(approved_embed_hosts).replace('.','\.') -SITE_NAME = environ.get("SITE_NAME").strip() -HCAPTCHA_SITEKEY = environ.get("HCAPTCHA_SITEKEY","").strip() -HCAPTCHA_SECRET = environ.get("HCAPTCHA_SECRET","").strip() -SPAM_SIMILARITY_THRESHOLD = float(environ.get("SPAM_SIMILARITY_THRESHOLD", 0.5)) -SPAM_URL_SIMILARITY_THRESHOLD = float(environ.get("SPAM_URL_SIMILARITY_THRESHOLD", 0.1)) -SPAM_SIMILAR_COUNT_THRESHOLD = int(environ.get("SPAM_SIMILAR_COUNT_THRESHOLD", 10)) -COMMENT_SPAM_SIMILAR_THRESHOLD = float(environ.get("COMMENT_SPAM_SIMILAR_THRESHOLD", 0.5)) -COMMENT_SPAM_COUNT_THRESHOLD = int(environ.get("COMMENT_SPAM_COUNT_THRESHOLD", 10)) -DESCRIPTION = environ.get("DESCRIPTION", "rdrama.net caters to drama in all forms such as: Real life, videos, photos, gossip, rumors, news sites, Reddit, and Beyond™. There isn't drama we won't touch, and we want it all!").strip() -GUMROAD_LINK = environ.get("GUMROAD_LINK", "https://marsey1.gumroad.com/l/rdrama").strip() -GUMROAD_TOKEN = environ.get("GUMROAD_TOKEN", "").strip() -GUMROAD_ID = environ.get("GUMROAD_ID", "rdrama").strip() -DEFAULT_THEME = environ.get("DEFAULT_THEME", "midnight").strip() -DEFAULT_TIME_FILTER = environ.get("DEFAULT_TIME_FILTER", "all").strip() -CARD_VIEW = bool(int(environ.get("CARD_VIEW", 1))) -DISABLE_DOWNVOTES = bool(int(environ.get("DISABLE_DOWNVOTES", 0))) -DISCORD_SERVER_ID = environ.get("DISCORD_SERVER_ID",'').strip() -DISCORD_CLIENT_ID = environ.get("DISCORD_CLIENT_ID",'').strip() -DISCORD_CLIENT_SECRET = environ.get("DISCORD_CLIENT_SECRET",'').strip() -DISCORD_BOT_TOKEN = environ.get("DISCORD_BOT_TOKEN",'').strip() -DISCORD_AUTH = environ.get("DISCORD_AUTH",'').strip() -GIPHY_KEY = environ.get('GIPHY_KEY').strip() -MASTER_KEY = environ.get("MASTER_KEY") -FP = environ.get("FP") -KOFI_TOKEN = environ.get("KOFI_TOKEN") -KOFI_LINK = environ.get("KOFI_LINK") - tiers={ "(Paypig)": 1, "(Renthog)": 2, @@ -1156,8 +1157,6 @@ has_sidebar = path.exists(f'files/templates/sidebar_{SITE_NAME}.html') has_logo = path.exists(f'files/assets/images/{SITE_NAME}/logo.webp') has_app = path.exists(f'files/assets/app_{SITE_NAME}_v2.4.apk') -GLOBAL = environ.get("GLOBAL") - ONLINE_STR = f'{SITE}_online' forced_hats = { diff --git a/files/helpers/jinja2.py b/files/helpers/jinja2.py index 02d7c7751..b0d8a3b70 100644 --- a/files/helpers/jinja2.py +++ b/files/helpers/jinja2.py @@ -69,7 +69,7 @@ def inject_constants(): "DEFAULT_THEME":DEFAULT_THEME, "DESCRIPTION":DESCRIPTION, "has_sidebar":has_sidebar, "has_logo":has_logo, "has_app":has_app, "FP":FP, "NOTIF_MODACTION_JL_MIN":NOTIF_MODACTION_JL_MIN, "cache":cache, - "ONLINE_STR":ONLINE_STR, "patron":patron, "dues":dues, + "ONLINE_STR":ONLINE_STR, "patron":patron, "DUES":DUES, "SIDEBAR_THREAD":SIDEBAR_THREAD, "BANNER_THREAD":BANNER_THREAD, "BADGE_THREAD":BADGE_THREAD, "SNAPPY_THREAD":SNAPPY_THREAD, "KOFI_TOKEN":KOFI_TOKEN, "KOFI_LINK":KOFI_LINK, diff --git a/files/routes/login.py b/files/routes/login.py index 25a14b5a2..3d6f9da0e 100644 --- a/files/routes/login.py +++ b/files/routes/login.py @@ -310,7 +310,7 @@ def sign_up_post(v): if existing_account: return signup_error("An account with that username already exists.") - if HCAPTCHA_SITEKEY: + if HCAPTCHA_SITEKEY != 'blahblahblah': token = request.values.get("h-captcha-response") if not token: return signup_error("Unable to verify captcha [1].") diff --git a/files/templates/submit.html b/files/templates/submit.html index 557d0719e..b36f76b58 100644 --- a/files/templates/submit.html +++ b/files/templates/submit.html @@ -169,7 +169,7 @@ {% if FEATURES['COUNTRY_CLUB'] -%}
- +
{%- endif %}